我的理解是查询 null 查找为 null 的字段以及不存在的字段。
mongo 手册还指出“即使有索引,$exists 也不是很有效”
查询 null 也应该被认为是低效的吗?
如果知道要查找的字段存在但为null,这样写是不是更高效:
db.foo.find({ "y": { $type : 10 } } )
比:
db.foo.find({ "y": null } )
假设字段被索引
编辑:给出一些使用方式的上下文,以便人们可以建议更好的方法: 我正在跟踪文档上发生的处理步骤。 每个步骤都有一个时间戳,所以我知道它是什么时候发生的。 定期运行内务处理流程并检查是否有任何未发生的任务(即不存在完成时间戳)以确保没有遗漏任何内容
最佳答案
我不能肯定地说哪个更快,但是有一个 thread in the news group有人对 $type
-query 的性能有问题。
撇开这一点不谈,我不会使用 $type
查询有以下三个原因:
- 它更难阅读和理解。即使是普通的 MongoDB 用户也可能不知道
{type : 10}
是什么。 - 正如您已经指出的,语义是不同的。
$type
查询允许“两种不同类型的 null”,即该字段不存在的文档,以及该字段存在但为空的文档。反序列化后,这可能会变成大多数语言中的相同对象,但$type
-query 会区分它们。 - 索引用于索引数据,而不是元信息。即使查询优化器能够映射它,我仍然会坚持使用更直接的解决方案。
我相信另一个性能风险可能是 null 值的潜在低选择性:如果一半文档具有某个值 y
而一半文档具有 null y
,查询空元素将返回大量文档,并且迭代游标可能会很昂贵。不过,只有在存在大量空值时才会出现这种情况。
关于MongoDB 搜索 "null"是否比搜索 "does not exist"更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10917822/