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?

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

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

8

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

{ "sent_at": null }

0

Vous pouvez également essayer ceci:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.