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

La query restituisce risultati più del previsto

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.