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

And*_*rew 97 null exists mongodb mongodb-query

我有一个Emailsent_at日期字段的文件:

{
  'sent_at': Date( 1336776254000 )
}
Run Code Online (Sandbox Code Playgroud)

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

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

db.emails.count({sent_at: {$ne: null}})
Run Code Online (Sandbox Code Playgroud)

但是我应该如何计算未发送的数量呢?

jdi*_*jdi 161

如果在未设置的情况下sent_at字段不存在,则:

db.emails.count({sent_at: {$exists: false}})
Run Code Online (Sandbox Code Playgroud)

如果它在那里和null,或者根本没有:

db.emails.count({sent_at: null})
Run Code Online (Sandbox Code Playgroud)

请参阅此处查询和null

  • 现在这是一个完整的答案。简直太棒了!谢谢 (3认同)

tvs*_*tvs 13

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

db.emails.count({sent_at: { $type: 10 }})
Run Code Online (Sandbox Code Playgroud)

  • 赞成,因为当将“find”与普通“null”一起使用时,它将“0.0”等值解释为“null”,并且此解决方案避免了这种情况 (2认同)

Ani*_*lam 10

使用:

db.emails.count({sent_at: null})
Run Code Online (Sandbox Code Playgroud)

对count_at属性为null或未设置的所有电子邮件进行计数.以上查询与以下相同.

db.emails.count($or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
])
Run Code Online (Sandbox Code Playgroud)


Jim*_*rng 7

似乎你可以做单行:

{ "sent_at": null }
Run Code Online (Sandbox Code Playgroud)