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

kupeojn6  于 2023-01-04  发布在  Go
关注(0)|答案(9)|浏览(232)

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

{
  'sent_at': Date( 1336776254000 )
}

如果此Email尚未发送,则sent_at字段为空或不存在。
我需要获得所有已发送/未发送Emails的计数。我一直在尝试找出查询此信息的正确方法。我认为这是获得已发送计数的正确方法:

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

但我该如何计算未发送邮件的数量呢?

rks48beu

rks48beu1#

如果sent_at字段在未设置时不存在,则:

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

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

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

如果它存在并且为空:

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

MongoDB手册的Query for Null or Missing Fields部分描述了如何查询空值和缺失值。

相等过滤器

{ item : null }查询匹配包含值为null * 的item字段的文档,或者匹配不包含item字段的 * 的文档。

db.inventory.find( { item: null } )

存在性检查

下面的示例查询不包含字段的文档。
{ item : { $exists: false } }查询匹配不包含item字段的文档:

db.inventory.find( { item : { $exists: false } } )

类型检查

{ item : { $type: 10 } }查询 * 仅 * 匹配包含item字段(其值为null)的文档;即项目字段的值为BSON TypeNull(类型号10):

db.inventory.find( { item : { $type: 10 } } )
h43kikqp

h43kikqp2#

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

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

ubof19bj3#

use:

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

统计所有sent_at属性为空或未设置的邮件,以上查询同下。

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

e3bfsja24#

似乎你可以只做一行:

{ "sent_at": null }
o4tp2gmn

o4tp2gmn5#

以上所有的答案都是惊人的和正确的。只是想增加一个改进的答案,这是使用$type
从MongoDB 3.2开始,您可以避免使用10(因为硬编码的文字会降低代码的可读性),而可以简单地使用字符串别名,即"null"

1.如果要选取存在sent_at且值为null的记录

db.emails.count({sent_at: { $type: 'null' }});

// or
// This reduces the code readability as your peer might not know
// that what is the meaning of value 10
db.emails.count({sent_at: { $type: 10 }});

2.如果要选取不存在sent_at: nullsent_at的记录

// This will ensure both the conditions
db.emails.count({ sent_at: null })

3.如果只需要不存在sent_at的记录

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

4.如果只想在字段存在且可能具有任何值的位置选取sent_at

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

请记住,这将拉取emails的任何文档,该文档具有任何值,包括null0''false

hujrc8aj

hujrc8aj6#

如果需要检查同一文档中是否存在属性且值等于空值-

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

以上可以在单行查询中完成,这将花费较少的时间,因为-

db.emails.count($or: [ {sent_at: nil }])

因为如果除了值之外的键doesn't exist也是null,则nil将获取文档。
它拯救了我的一天。
注意:在较新版本的mongodb中使用nil而不是null

jm81lzqq

jm81lzqq7#

你也可以试试这个:

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

0s7z1bwu8#

可以使用$in运算符检查这两种情况

db.emails.find({"sent_at": {$in:[null,""]}).count()
4jb9z9bj

4jb9z9bj9#

db.employe.find({ $and:[ {"dept":{ $exists:false }, "empno": { $in:[101,102] } } ] }).count();

相关问题