MongoDB: como consultar registros em que o campo é nulo ou não está definido?

106

Eu tenho um Emaildocumento que tem um sent_atcampo de data:

{
  'sent_at': Date( 1336776254000 )
}

Se Emailnão tiver sido enviado, o sent_atcampo é nulo ou inexistente.

Preciso obter a contagem de todos os enviados / não enviados Emails. Estou preso em tentar descobrir a maneira certa de consultar essas informações. Acho que esta é a maneira certa de obter a contagem de enviados:

db.emails.count({sent_at: {$ne: null}})

Mas como devo fazer a contagem dos que não foram enviados?

Andrew
fonte

Respostas:

170

Se o campo sent_at não estiver lá quando não estiver definido, então:

db.emails.count({sent_at: {$exists: false}})

Se estiver lá e nulo, ou não estiver lá:

db.emails.count({sent_at: null})

Consulte aqui para consultar e nulo

jdi
fonte
16

Se você deseja contar APENAS os documentos com sent_atdefinido com um valor de null(não conte os documentos com sent_atnão definido):

db.emails.count({sent_at: { $type: 10 }})
tvs
fonte
Obrigado. Ao verificar se o campo existe, mas definido como nulo, isso é muito útil.
jstice4all
Votado porque ao usar findcom plain, nullele interpreta valores como 0.0as nulle esta solução evita isso
Matthias Herrmann
12

Usar:

db.emails.count({sent_at: null})

Que conta todos os emails cuja propriedade sent_at é nula ou não está configurada. A consulta acima é igual à abaixo.

db.emails.count($or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
])
Anil Tallam
fonte
8

Parece que você pode fazer apenas uma linha:

{ "sent_at": null }
Jim Horng
fonte
0

Você também pode tentar isto:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
Vivek Maraina
fonte