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?

Respuestas:


184

Uso $ne(para "no igual")

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

¿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}})

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}})
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.