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: null或sent_at的记录
// This will ensure both the conditions
db.emails.count({ sent_at: null })
9条答案
按热度按时间rks48beu1#
如果
sent_at
字段在未设置时不存在,则:如果它在那里但为空,或者根本不存在:
如果它存在并且为空:
MongoDB手册的Query for Null or Missing Fields部分描述了如何查询空值和缺失值。
相等过滤器
{ item : null }
查询匹配包含值为null
* 的item字段的文档,或者匹配不包含item
字段的 * 的文档。存在性检查
下面的示例查询不包含字段的文档。
{ item : { $exists: false } }
查询匹配不包含item
字段的文档:类型检查
{ item : { $type: 10 } }
查询 * 仅 * 匹配包含item
字段(其值为null
)的文档;即项目字段的值为BSON TypeNull
(类型号10
):h43kikqp2#
如果只想计算
sent_at
定义为null
值的文档(不计算未设置sent_at
的文档):ubof19bj3#
use:
统计所有sent_at属性为空或未设置的邮件,以上查询同下。
e3bfsja24#
似乎你可以只做一行:
o4tp2gmn5#
以上所有的答案都是惊人的和正确的。只是想增加一个改进的答案,这是使用
$type
。从MongoDB 3.2开始,您可以避免使用
10
(因为硬编码的文字会降低代码的可读性),而可以简单地使用字符串别名,即"null"
。1.如果要选取存在
sent_at
且值为null
的记录2.如果要选取不存在
sent_at: null
或sent_at
的记录3.如果只需要不存在
sent_at
的记录4.如果只想在字段存在且可能具有任何值的位置选取
sent_at
请记住,这将拉取
emails
的任何文档,该文档具有任何值,包括null
、0
、''
、false
。hujrc8aj6#
如果需要检查同一文档中是否存在属性且值等于空值-
以上可以在单行查询中完成,这将花费较少的时间,因为-
因为如果除了值之外的键
doesn't exist
也是null
,则nil
将获取文档。它拯救了我的一天。
注意:在较新版本的mongodb中使用
nil
而不是null
。jm81lzqq7#
你也可以试试这个:
0s7z1bwu8#
可以使用$in运算符检查这两种情况
4jb9z9bj9#