MongoDB:如何查询字段为空或未设置的记录?


106

我有一个Email包含sent_at日期字段的文档:

{
  'sent_at': Date( 1336776254000 )
}

如果Email尚未发送,则该sent_at字段为null或不存在。

我需要获取所有已发送/未发送的计数Emails。我一直试图找出正确的方法来查询此信息。我认为这是获取发送计数的正确方法:

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

但是我应该如何计算未发送的邮件呢?

Answers:


170

如果未设置send_at字段,则该字段不存在:

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

如果它在那里并且为空,或者根本不存在:

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

请在此处查询并返回null


16

如果您只想计算sent_at定义为的文档null(不计算sent_at未设置的文档):

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

谢谢。当检查字段是否存在但设置为null时,这非常有用。
jstice4all

受到支持是因为当find与Plain一起使用时,null它解释0.0为as的值 ,null并且此解决方案避免了这种情况
Matthias Herrmann,

12

用:

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

计数所有send_at属性为null或未设置的电子邮件。上面的查询与下面的相同。

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


0

您也可以尝试以下操作:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.