sql >> Database >  >> NoSQL >> MongoDB

Query levert meer dan verwachte resultaten op

Dit gedrag wordt verwacht en uitgelegd in mongo-documentatie hier .

Mongo lijkt bereid om "zelfvoldaan" te spelen door resultaten terug te geven wanneer een combinatie van array-elementen onafhankelijk van elkaar aan alle voorwaarden voldoet.

In ons voorbeeld komt 5 overeen met de $lt:20 voorwaarde en 25 komt overeen met de $gt:10 voorwaarde. Het is dus een match.

Beide van de volgende zullen het resultaat [5,25] retourneren:

db.collection.find({ x: {$gt: 10, $lt: 20} })

db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })

Als dit door de gebruiker verwacht gedrag is, kunnen de meningen verschillen. Maar het is zeker gedocumenteerd en zou te verwachten zijn.

Bewerken , voor Neil's sadistische maar zeer leerzame bewerking van het originele antwoord, vragend om een ​​oplossing:

Gebruik van de $elemMatch kan "strengere" elementvergelijkingen maken voor alleen arrays .

db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20  } } })

Opmerking :dit komt overeen met zowel x:[11,12] en x:[11,25]

Ik geloof dat wanneer een zoekopdracht als deze nodig is, een combinatie op twee query's is vereist en de resultaten worden gecombineerd. Hieronder staat een query die correcte resultaten retourneert voor documenten waarbij x geen array is :

db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )

Maar de beste aanpak in dit geval is om het type x te veranderen in altijd een array zijn, zelfs als deze maar één element bevat. Dan is alleen de $elemMatch-query vereist om correcte resultaten te krijgen, met verwacht gedrag.



  1. Hoe vind je de grootte van het specifieke document in MonogoDB Collection?

  2. Predis met laravel 5.5 Geen verbindingen beschikbaar in het zwembad in Aggregate/RedisCluster.php:337

  3. De importmodi van mongoimport

  4. Kunnen $in en $or elkaar vervangen in MongoDB?