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?

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


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

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

8

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

{ "sent_at": null }

0

Sie können dies auch versuchen:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.