MongoDB: Wie kann ich nach Datensätzen abfragen, bei denen das Feld null ist oder nicht?

106

Ich habe ein EmailDokument mit einem sent_atDatumsfeld:

{
  'sent_at': Date( 1336776254000 )
}

Wenn dies Emailnicht gesendet wurde, ist das sent_atFeld entweder null oder nicht vorhanden.

Ich muss die Anzahl aller gesendeten / nicht gesendeten Daten ermitteln Emails. Ich bin nicht in der Lage, herauszufinden, wie ich diese Informationen richtig abfragen kann. Ich denke, dies ist der richtige Weg, um die gesendete Anzahl zu erhalten:

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

Aber wie soll ich die Anzahl derjenigen ermitteln, die nicht gesendet wurden?

Andrew
quelle

Antworten:

170

Wenn das Feld sent_at nicht vorhanden ist, wenn es nicht festgelegt ist, dann:

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

Wenn es da und null ist oder überhaupt nicht da:

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

Hier finden Sie Abfragen und Null

jdi
quelle
16

Wenn Sie NUR die Dokumente zählen möchten, sent_atdie mit einem Wert von definiert sind null(zählen Sie nicht die Dokumente mit sent_atnicht festgelegt):

db.emails.count({sent_at: { $type: 10 }})
Fernseher
quelle
Danke dir. Wenn Sie prüfen, ob ein Feld vorhanden ist, aber auf null gesetzt ist, ist dies sehr nützlich.
jstice4all
Upvoted, weil bei Verwendung findmit Plain nullWerte wie 0.0as interpretiert werden nullund diese Lösung dies vermeidet
Matthias Herrmann
12

Verwenden:

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

Dies zählt alle E-Mails, deren Eigenschaft sent_at null oder nicht festgelegt ist. Die obige Abfrage ist dieselbe wie unten.

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

Scheint, Sie können nur eine einzelne Zeile tun:

{ "sent_at": null }
Jim Horng
quelle
0

Sie können dies auch versuchen:

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