sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo Fråga $gt,$lt

Det här är ett riktigt förvirrande ämne. Jag jobbar på 10gen och jag var tvungen att lägga en stund på att vira huvudet runt det;)

Låt oss gå igenom hur frågemotorn bearbetar den här frågan.

Här är frågan igen:

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

När det kommer till posten som verkar som om den inte borde matcha...

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

Matchningen utförs inte mot varje element i arrayen, utan snarare mot arrayen som helhet.

Jämförelsen utförs i tre steg:

Steg 1 :Hitta alla dokument där b har ett värde större än 4

b:[2,4,6,8] matchar eftersom 6 och 8 är större än 4

Steg 2 :Hitta alla dokument där b har ett värde mindre än 6

b:[2,4,6,8] matchar eftersom 2 och 4 är mindre än 6

Steg 3 :Hitta den uppsättning dokument som matchade i både steg 1 och 2.

Dokumentet med b:[2,4,6,8] matchade båda steg 1 och 2 så det returneras som en matchning. Observera att resultaten också dedupliceras i det här steget, så samma dokument kommer inte att returneras två gånger.

Om du vill att din fråga ska tillämpas på de enskilda elementen i arrayen, snarare än arrayen som helhet, kan du använda operatorn $elemMatch. Till exempel

> 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 ] }


  1. Hur man använder $cond operation i Spring-MongoDb aggregeringsramverk

  2. Använda Redis för köer för flera Laravel-applikationer på en enda server

  3. Hur man installerar Apache CouchDB på CentOS 8

  4. Ger Mongoose tillgång till tidigare värde på egendom i pre('save')?