Compruebe que el campo existe con MongoDB

131

Así que intento encontrar todos los registros que tienen un conjunto de campos y no son nulos.

Intento usar $exists, sin embargo, de acuerdo con la documentación de MongoDB, esta consulta devolverá campos que son iguales a nulos.

$exists coincide con los documentos que contienen el campo que almacena el valor nulo.

Así que ahora supongo que tendré que hacer algo como esto:

db.collection.find({ "fieldToCheck" : { $exists : true, $not : null } })

Sin embargo, cada vez que intento esto, aparece el error ¿ [invalid use of $not] Alguien tiene una idea de cómo consultar esto?

AlbertEngelB
fuente

Respuestas:

184

Uso $ne(para "no igual")

db.collection.find({ "fieldToCheck": { $exists: true, $ne: null } })
Sergio Tulentsev
fuente
¿Qué devuelve esto? ¿Una colección nula? ¿Un solo artículo? ¿Una matriz?
Oliver Dixon
44
@iLoveUnicorns: lo que findsiempre devuelve: una colección de registros que coinciden con los criterios.
Sergio Tulentsev
2
@SergioTulentsev AFAIK devuelve un cursor
fernandohur
@fernandohur: sí, pero si tiene menos de una página de documentos, ni siquiera verá la diferencia. Y si tuviera que ejecutar esta consulta desde un controlador externo, estoy bastante seguro de que la mayoría de ellos lo protegen de los detalles de implementación del cursor.
Sergio Tulentsev
24

Supongamos que tenemos una colección como la siguiente:

{ 
  "_id":"1234"
  "open":"Yes"
  "things":{
             "paper":1234
             "bottle":"Available"
             "bottle_count":40
            } 
}

¿Queremos saber si el campo de botella está presente o no?

Respuesta:

db.products.find({"things.bottle":{"$exists":true}})
Pavan Choudhary
fuente
2
When <boolean> is true, $exists matches the documents that contain the field, including documents where the field value is null. De los documentos.
AlbertEngelB
1
sí, pero no veo por qué un DB contendría el valor nulo, es descuidado
Martijn Scheffer
3

encuentro que esto funciona para mi

db.getCollection('collectionName').findOne({"fieldName" : {$ne: null}})
Mansión Yakir
fuente