MongoDB 搜索 "null"是否比搜索 "does not exist"更快?

标签 mongodb nosql

我的理解是查询 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 查询有以下三个原因:

  1. 它更难阅读和理解。即使是普通的 MongoDB 用户也可能不知道 {type : 10} 是什么。
  2. 正如您已经指出的,语义是不同的。 $type 查询允许“两种不同类型的 null”,即该字段不存在的文档,以及该字段存在但为空的文档。反序列化后,这可能会变成大多数语言中的相同对象,但 $type-query 会区分它们。
  3. 索引用于索引数据,而不是元信息。即使查询优化器能够映射它,我仍然会坚持使用更直接的解决方案。

我相信另一个性能风险可能是 null 值的潜在低选择性:如果一半文档具有某个值 y 而一半文档具有 null y ,查询空元素将返回大量文档,并且迭代游标可能会很昂贵。不过,只有在存在大量空值时才会出现这种情况。

关于MongoDB 搜索 "null"是否比搜索 "does not exist"更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10917822/

相关文章:

android - 基于属性exist(key)的Firebase查询

mongodb - nosql:MongoDB、Cassandra 或数据仓库的替代方案

node.js - 我的 Mongoose 关系出了什么问题?

java - 如何在 Java 应用程序中打印 mongodb 中的 public static final 成员?

scala - 使用 Scala (Casbah/Rogue) 在 MongoDB 中分组(聚合 Map Reduce 函数)

ruby-on-rails - Rails 和 MongoDB 与 MongoMapper

node.js - 使用 Mongoose 在 Node js中连接多个mongo db数据库

mongodb - 自动压缩mongodb中删除的空间?

nosql - 学习 NoSql/非关系数据库的资源

java - Jedis 改变 Redis 的语义?