MongoDB: Jak zapytać o rekordy, w których pole ma wartość null lub nie jest ustawione?

106

Mam Emaildokument z sent_atpolem daty:

{
  'sent_at': Date( 1336776254000 )
}

Jeśli to Emailnie zostało wysłane, sent_atpole ma wartość null lub nie istnieje.

Muszę uzyskać liczbę wszystkich wysłanych / niewysłanych Emails. Utknąłem na próbach znalezienia właściwego sposobu zapytania o te informacje. Myślę, że to właściwy sposób, aby uzyskać liczbę wysłanych:

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

Ale jak mam policzyć te, które nie zostały wysłane?

Andrzej
źródło

Odpowiedzi:

16

Jeśli chcesz TYLKO policzyć dokumenty ze sent_atzdefiniowaną wartością null(nie licz dokumentów z sent_atnie ustawionymi):

db.emails.count({sent_at: { $type: 10 }})
telewizory
źródło
Dziękuję Ci. Jest to bardzo przydatne podczas sprawdzania, czy pole istnieje, ale ma wartość null.
jstice4all
Upvoted, ponieważ przy stosowaniu findw zwykły nullinterpretuje wartość jak 0.0jak nulli roztwór ten unika tego
Matthias Herrmann
12

Posługiwać się:

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

Zlicza wszystkie e-maile, których właściwość sent_at ma wartość null lub nie jest ustawiona. Powyższe zapytanie jest takie samo jak poniżej.

db.emails.count($or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
])
Anil Tallam
źródło
8

Wygląda na to, że możesz po prostu zrobić pojedynczą linię:

{ "sent_at": null }
Jim Horng
źródło
0

Możesz też spróbować tego:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
Vivek Maraina
źródło
0
db.employe.find({ $and:[ {"dept":{ $exists:false }, "empno": { $in:[101,102] } } ] }).count();
SagitSri
źródło