MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Die Abfrage gibt mehr als erwartete Ergebnisse zurück

Dieses Verhalten wird in der Mongo-Dokumentation erwartet und erklärt hier .

Mongo scheint bereit zu sein, "selbstgefällig" zu spielen, indem es Ergebnisse zurückgibt, wenn eine Kombination von Array-Elementen alle Bedingungen unabhängig voneinander erfüllt.

In unserem Beispiel entspricht 5 der Bedingung $lt:20 und 25 der Bedingung $gt:10. Es ist also eine Übereinstimmung.

Die beiden folgenden geben das Ergebnis [5,25] zurück:

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

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

Wenn dies ein vom Benutzer erwartetes Verhalten ist, können die Meinungen abweichen. Aber es ist sicherlich dokumentiert und sollte erwartet werden.

Bearbeiten , für Neils sadistische, aber sehr lehrreiche Bearbeitung der ursprünglichen Antwort, mit der Bitte um eine Lösung:

Verwendung von $elemMatch kann "strengere" Elementvergleiche für nur Arrays durchführen .

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

Hinweis :Dies wird mit x:[11,12] und übereinstimmen x:[11,25]

Ich glaube, wenn eine Abfrage wie diese benötigt wird, eine Kombination auf zwei Abfragen erforderlich sind und die Ergebnisse kombiniert werden. Nachfolgend finden Sie eine Abfrage, die korrekte Ergebnisse für Dokumente zurückgibt, bei denen x kein Array ist :

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

Aber der beste Ansatz In diesem Fall ändern Sie den Typ von x in immer ein Array sein, auch wenn es nur ein Element enthält. Dann ist nur die $elemMatch-Abfrage erforderlich, um korrekte Ergebnisse mit erwartetem Verhalten zu erhalten.