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?

Respostas:


184

Use $ne(para "diferente de")

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

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

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}})
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.