sql >> Databasteknik >  >> NoSQL >> MongoDB

Frågan ger mer än förväntat resultat

Detta beteende förväntas och förklaras i mongo-dokumentationen här .

Mongo verkar vara villig att spela "självgod", genom att ge tillbaka resultat när en kombination av arrayelement matchar alla villkor oberoende av varandra.

I vårt exempel matchar 5 $lt:20-villkoret och 25 matchar $gt:10-villkoret. Så det är en match.

Båda följande kommer att returnera resultatet [5,25]:

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

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

Om detta är användarens förväntade beteende kan åsikterna variera. Men det är verkligen dokumenterat och bör förväntas.

Redigera , för Neils sadistiska men mycket pedagogiska redigering av originalsvaret, som ber om en lösning:

Användning av $elemMatch kan göra "strängare" elementjämförelser för enbart arrayer .

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

Obs :detta kommer att matcha både x:[11,12] och x:[11,25]

Jag tror att när en fråga som denna behövs, en kombination på två frågor krävs, och resultaten kombineras. Nedan finns en fråga som returnerar korrekta resultat för dokument där x är inte en array :

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

Men det bästa tillvägagångssättet i det här fallet är att ändra typen av x till alltid vara en array, även när den bara innehåller ett element. Sedan krävs bara $elemMatch-frågan för att få korrekta resultat, med förväntat beteende.



  1. Hur utesluter jag fält från ett inbäddat dokument i Mongoid?

  2. Rätt sätt att lägga till fält till användarsamlingen i meteor

  3. Hur får man anslutningsstatus i C# MongoDB-drivrutinen v2.0?

  4. Klona en samling i MongoDB