MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Frage zur Mongo-Abfrage $gt,$lt

Das ist ein wirklich verwirrendes Thema. Ich arbeite bei 10gen und musste mich eine Weile damit beschäftigen;)

Sehen wir uns an, wie die Abfrage-Engine diese Abfrage verarbeitet.

Hier ist die Abfrage noch einmal:

> db.test.find({ b : { $gt :  4, $lt : 6}});

Wenn es zu dem Datensatz kommt, der so aussieht, als ob er nicht übereinstimmen sollte...

{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }

Der Abgleich wird nicht für jedes Element des Arrays durchgeführt, sondern für das Array als Ganzes.

Der Vergleich erfolgt in drei Schritten:

Schritt 1 :Alle Dokumente finden, bei denen b einen Wert größer als 4 hat

b:[2,4,6,8] Übereinstimmungen, weil 6 &8 größer als 4 sind

Schritt 2 :Alle Dokumente finden, bei denen b einen Wert kleiner als 6 hat

b:[2,4,6,8] Übereinstimmungen, weil 2 &4 kleiner als 6 sind

Schritt 3 :Finden Sie den Satz von Dokumenten, die in Schritt 1 und 2 übereinstimmen.

Das Dokument mit b:[2,4,6,8] stimmt mit beiden Schritten 1 und 2 überein, sodass es als Übereinstimmung zurückgegeben wird. Beachten Sie, dass die Ergebnisse in diesem Schritt auch dedupliziert werden, sodass dasselbe Dokument nicht zweimal zurückgegeben wird.

Wenn Sie möchten, dass Ihre Abfrage auf die einzelnen Elemente des Arrays und nicht auf das Array als Ganzes angewendet wird, können Sie den $elemMatch-Operator verwenden. Zum Beispiel

> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
  { "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }