【问题标题】:What Happens When Querying For Two Indexed (not compound) Fields in MongoDB在 MongoDB 中查询两个索引(非复合)字段时会发生什么
【发布时间】:2013-01-13 03:42:52
【问题描述】:

当您查询两个字段时会发生什么,因为它们不是复合索引的一部分,例如:

db.collection.ensureIndex( { a: 1 } )
db.collection.ensureIndex( { b: 1 } )

db.collection.find( { a: 2, b: 2 } )

我想知道是否可以扫描大量文档,或者 Mongo DB 是否不会扫描任何内容并且explain() 会返回:

indexOnly: YES

【问题讨论】:

标签: mongodb mongodb-query


【解决方案1】:

如果您要查找的所有值都在索引中(包括排序),则说明仅返回 indexOnly。基本上它表示一个覆盖索引:http://docs.mongodb.org/manual/applications/indexes/#create-indexes-that-support-covered-queries

在这种情况下,您通过两个字段进行查询,但其中只有一个在一个单独的索引中。

考虑到 MongoDB 不能为单个子句使用多个索引($or 是一个例外,因为它是多子句,它也不同于普通查询)它不会执行 indexOnly 查询,而是会搜索通过a 上的索引收集集合,然后对该范围内包含b 的文档进行全文档扫描,以了解其值并返回结果。

还请注意,要正确使用 indexOnly 游标,您应该使查询的以下部分适合单个索引:

  • 条件
  • 投影
  • 排序

即:

db.ensureIndex({a:1,b:1});
db.col.find({a:1}, {_id:0,a:1,b:1}).sort({b:1});

将使用 indexOnly 光标。

【讨论】:

  • 谢谢。所以它几乎会忽略“b”个人索引?在您的示例中,投影的 {_id:0...} 部分是必须的吗?在您的示例中, sort({b:1}) 也是必须的吗?
  • @GSchv 排序不是必需的,我只是作为示例放置。 _id 部分虽然来自我上面粘贴的链接:“......必须从结果集中明确排除 _id 字段,除非索引包含 _id。”
  • 谢谢,回答非常有帮助。
  • @GSchv 很高兴有帮助:)
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
相关资源
最近更新 更多