Denne adfærd forventes og forklares i mongo-dokumentationen her .
Mongo ser ud til at være villig til at spille "tilfreds" ved at give resultater tilbage, når en kombination af array-elementer matcher alle betingelser uafhængigt.
I vores eksempel matcher 5 $lt:20-betingelsen og 25 matcher $gt:10-betingelsen. Så det er et match.
Begge følgende vil returnere [5,25] resultatet:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Hvis dette er brugerforventet adfærd, kan meningerne variere. Men det er bestemt dokumenteret og bør forventes.
Rediger , for Neils sadistiske, men meget lærerige redigering af det originale svar, der beder om en løsning:
Brug af $elemMatch kan lave "strengere" elementsammenligninger for kun arrays .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Bemærk :dette vil matche både x:[11,12] og x:[11,25]
Jeg tror, når en forespørgsel som denne er nødvendig, en kombination på to forespørgsler er påkrævet, og resultaterne kombineret. Nedenfor er en forespørgsel, der returnerer korrekte resultater for dokumenter, hvor x er ikke en matrix :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Men den bedste tilgang i dette tilfælde er at ændre typen af x til altid være en matrix, selv når den kun indeholder ét element. Derefter kræves kun $elemMatch-forespørgslen for at få korrekte resultater med forventet adfærd.