sql >> Database teknologi >  >> NoSQL >> MongoDB

Forespørgsel returnerer mere end forventet resultater

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.



  1. Kan jeg lave en tekstforespørgsel med mongodb c#-driveren

  2. Hvorfor er der KEYS og ARGV-arrays, når du kalder Redis Lua-scripts?

  3. Sådan undgår du tidsgab, mens du samler OHLC i mongoDB

  4. Mongoose Query:Find et element inde i en matrix