sql >> Databáze >  >> NoSQL >> MongoDB

Dotaz vrací více než očekávaných výsledků

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.



  1. jak přidám hodnotu do horní části pole v mongodb?

  2. SpringBoot Elasticache JedisMovedDataException:MOVED

  3. Agregujte a aktualizujte MongoDB

  4. Rozdělit data kolem vyhledávacího dotazu během agregace