Toto chování je očekáváno a vysvětleno v mongo dokumentaci zde .
Zdá se, že Mongo je ochoten hrát na „samýka“ tím, že vrátí výsledky, když kombinace prvků pole nezávisle vyhovuje všem podmínkám.
V našem příkladu 5 odpovídá podmínce $lt:20 a 25 odpovídá podmínce $gt:10. Takže je to shoda.
Obě následující vrátí výsledek [5,25]:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Pokud je toto chování očekávané uživatelem, názory se mohou lišit. Ale určitě je to zdokumentováno a mělo by se to očekávat.
Upravit , za Neilovu sadistickou, ale vysoce vzdělávací úpravu původní odpovědi, která žádá o řešení:
Použití $elemMatch může provést "přísnější" porovnání prvků pro pouze pole .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Poznámka :toto bude odpovídat jak x:[11,12] tak x:[11,25]
Věřím, že když je potřeba takový dotaz, kombinace na dvou dotazy a výsledky se spojí. Níže je uveden dotaz, který vrací správné výsledky pro dokumenty, kde x není pole :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Ale nejlepší přístup v tomto případě je třeba změnit typ x na vždy být polem, i když obsahuje pouze jeden prvek. Poté je k získání správných výsledků s očekávaným chováním vyžadován pouze dotaz $elemMatch.