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.