MongoDB: Comment rechercher des enregistrements où le champ est nul ou non défini?

106

J'ai un Emaildocument qui a un sent_atchamp de date:

{
  'sent_at': Date( 1336776254000 )
}

Si cela Emailn'a pas été envoyé, le sent_atchamp est nul ou inexistant.

J'ai besoin d'obtenir le décompte de tous les envois / non envoyés Emails. Je suis coincé à essayer de trouver la bonne façon de rechercher ces informations. Je pense que c'est la bonne façon d'obtenir le nombre d'envois:

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

Mais comment obtenir le nombre de ceux qui ne sont pas envoyés?

Andrew
la source

Réponses:

16

Si vous voulez compter UNIQUEMENT les documents avec sent_atdéfinis avec une valeur de null(ne comptez pas les documents avec sent_atnon défini):

db.emails.count({sent_at: { $type: 10 }})
téléviseurs
la source
Je vous remercie. Lorsque vous vérifiez si le champ existe mais défini sur null, cela est très utile.
jstice4all
Voté parce que lorsqu'il est utilisé findavec plain, nullil interprète des valeurs comme 0.0as nullet cette solution évite cela
Matthias Herrmann
12

Utilisation:

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

Qui compte tous les e-mails dont la propriété sent_at est nulle ou n'est pas définie. La requête ci-dessus est la même que ci-dessous.

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

Il semble que vous ne pouvez faire qu'une seule ligne:

{ "sent_at": null }
Jim Horng
la source
0

Vous pouvez également essayer ceci:

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