在查询MongoDB中的两个索引(非复合)字段时会发生什么

时间:2013-01-12 19:22:26

标签: mongodb mongodb-query

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

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

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

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

indexOnly: YES

1 个答案:

答案 0 :(得分: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光标。