Verifique se o campo existe com o MongoDB

131

Então, eu estou tentando encontrar todos os registros que têm um campo definido e não é nulo.

Eu tento usar $exists, no entanto, de acordo com a documentação do MongoDB, essa consulta retornará campos iguais a nulo.

$exists corresponde a documentos que contêm o campo que armazena o valor nulo.

Então, agora estou assumindo que vou ter que fazer algo assim:

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

No entanto, sempre que tento fazer isso, recebo o erro [invalid use of $not] Alguém tem uma idéia de como consultar isso?

AlbertEngelB
fonte

Respostas:

184

Use $ne(para "diferente de")

db.collection.find({ "fieldToCheck": { $exists: true, $ne: null } })
Sergio Tulentsev
fonte
O que isso retorna? Uma coleção nula? Um único item? Uma matriz?
Oliver Dixon
4
@iLoveUnicorns: o que findsempre retorna: uma coleção de registros, que corresponde aos critérios.
Sergio Tulentsev
2
@SergioTulentsev AFAIK ele retorna um cursor
fernandohur
@fernandohur: sim, mas se você tiver menos de uma página de documentos, nem verá a diferença. E se você executasse essa consulta a partir de um driver externo, tenho certeza que a maioria deles o protege dos detalhes de implementação do cursor.
Sergio Tulentsev 03/02
24

Suponha que tenhamos uma coleção como abaixo:

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

Queremos saber se o campo da garrafa está presente ou não?

Resp:

db.products.find({"things.bottle":{"$exists":true}})
Pavan Choudhary
fonte
2
When <boolean> is true, $exists matches the documents that contain the field, including documents where the field value is null. Dos documentos.
AlbertEngelB
1
sim, mas eu não' ver por que um DB deve conter o valor nulo, é desleixado
Martijn Scheffer
3

Eu acho que isso funciona para mim

db.getCollection('collectionName').findOne({"fieldName" : {$ne: null}})
Yakir Manor
fonte