Mongo: trova elementi che non hanno un determinato campo


107

Come cercare documenti in una raccolta a cui manca un determinato campo in MongoDB?

Risposte:


171

Sì, è possibile usare $ exist :

db.things.find( { a : { $exists : false } } ); // return if a is missing

Quando è vero, $ esiste corrisponde ai documenti che contengono il campo, inclusi i documenti in cui il valore del campo è nullo. Se è falso, la query restituisce solo i documenti che non contengono il campo.


1
Attenzione, le $existquery non possono utilizzare gli indici (vedere mongodb.org/display/DOCS/… ).
Theo

4
@Theo: A partire da MongoDB 2.0 $ esiste è in grado di utilizzare gli indici ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich

Stavo cercando questo per Mongoid da usare in un mirino. Assomiglia a questo>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

Se non ti interessa se il campo manca o null(o se non lo è mai null), puoi utilizzare il campo leggermente più corto e più sicuro:

db.things.find( { a : null } ); // return if a is missing or null

È più sicuro perché $existstornerà trueanche se il campo è nullo, il che spesso non è il risultato desiderato e può portare a un NPE.


1
Tuttavia, qualcuno che legge il codice potrebbe interpretarlo come il campo deve essere uguale nulle non mancante. Questo è in realtà un comportamento inaspettato, perché non saresti in grado di fare lo stesso per 0(che è anche false), quindi nullè una specie di eccezione qui. Pertanto, la migliore pratica è la risposta più leggibile $exists: falseche non è ambigua. Ricorda, la tua variante leggermente più corta non è in realtà più corta se hai bisogno di quel commento dietro di essa!
Yeti

@Yeti se il mio obiettivo è trovare tutti gli oggetti a cui manca un valore per il campo a, perché aè nullo perché amanca, allora $existsnon è abbastanza buono, poiché non cattura i casi in cui si atrova null.
nilskp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.