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.