Questo comportamento è previsto e spiegato nella documentazione di mongo qui .
Mongo sembra essere disposto a fare il "compiaciuto", restituendo risultati quando una combinazione di elementi dell'array soddisfa tutte le condizioni in modo indipendente.
Nel nostro esempio, 5 corrisponde alla condizione $lt:20 e 25 corrisponde alla condizione $gt:10. Quindi, è una corrispondenza.
Entrambi i seguenti restituiranno il risultato [5,25]:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Se questo è il comportamento previsto dall'utente, le opinioni possono variare. Ma è certamente documentato e dovrebbe essere previsto.
Modifica , per la modifica sadica ma altamente educativa di Neil alla risposta originale, chiedendo una soluzione:
Utilizzo di $elemMatch può effettuare confronti di elementi "più rigidi" per solo array .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Nota :corrisponderà a x:[11,12] e x:[11,25]
Credo che quando è necessaria una query come questa, una combinazione di due le query sono obbligatorie e i risultati combinati. Di seguito è riportata una query che restituisce risultati corretti per documenti con x non un array :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Ma l'approccio migliore in questo caso è cambiare il tipo di x in sempre essere un array, anche quando contiene un solo elemento. Quindi, è necessaria solo la query $elemMatch per ottenere risultati corretti, con il comportamento previsto.