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