web-dev-qa-db-fra.com

MongoDB: Comment interroger des enregistrements dont le champ est nul ou non défini?

J'ai un document Email qui a un sent_at champ date:

{
  'sent_at': Date( 1336776254000 )
}

Si ce Email n'a pas été envoyé, le sent_at le champ est nul ou inexistant.

J'ai besoin de connaître le nombre total de messages envoyés/non envoyés Emails. Je suis coincé à essayer de trouver la bonne façon d'interroger cette information. Je pense que c'est la bonne façon d'obtenir le décompte envoyé:

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

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

96
Andrew

Si le champ sent_at n'est pas présent alors qu'il n'est pas défini, alors:

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

Si c'est là et nul, ou pas du tout:

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

Voir ici pour les requêtes et null

159
jdi

Si vous voulez seulement compter les documents avec sent_at défini avec une valeur de null (ne comptez pas les documents avec sent_at pas encore défini):

db.emails.count({sent_at: { $type: 10 }})
13
tvs

Utilisation:

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

Ce qui compte tous les emails dont la propriété sent_at est nulle ou non 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}
])
10
Anil Tallam

On dirait que vous ne pouvez faire qu'une seule ligne:

{ "sent_at": null }
7
Jim Horng

Vous pouvez aussi essayer ceci:

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