MongoDB: Bagaimana cara membuat kueri untuk catatan di mana bidang kosong atau tidak disetel?

106

Saya memiliki Emaildokumen dengan sent_atbidang tanggal:

{
  'sent_at': Date( 1336776254000 )
}

Jika ini Emailbelum dikirim, sent_atbidangnya kosong, atau tidak ada.

Saya perlu menghitung semua yang terkirim / tidak terkirim Emails. Saya terjebak dalam mencoba mencari cara yang tepat untuk menanyakan informasi ini. Saya pikir ini adalah cara yang tepat untuk mendapatkan hitungan terkirim:

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

Tapi bagaimana saya bisa mendapatkan jumlah yang tidak terkirim?

Andrew
sumber

Jawaban:

170

Jika bidang sent_at tidak ada saat tidak disetel, maka:

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

Jika itu ada dan nol, atau tidak ada sama sekali:

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

Lihat di sini untuk membuat kueri dan null

jdi
sumber
16

Jika Anda ingin HANYA menghitung dokumen dengan sent_atditentukan dengan nilai null(jangan hitung dokumen dengan sent_attidak ditetapkan):

db.emails.count({sent_at: { $type: 10 }})
TV
sumber
Terima kasih. Saat memeriksa apakah bidang ada tetapi disetel ke nol, ini sangat berguna.
jstice4all
Upvoted karena ketika menggunakan finddengan polos nullitu menafsirkan nilai-nilai seperti 0.0sebagai nulldan solusi ini menghindari ini
Matthias Herrmann
12

Menggunakan:

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

Yang menghitung semua email yang properti sent_atnya null atau tidak disetel. Kueri di atas sama seperti di bawah ini.

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

Sepertinya Anda hanya bisa melakukan satu baris:

{ "sent_at": null }
Jim Horng
sumber
0

Anda juga dapat mencoba ini:

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