当您查询两个字段时会发生什么,因为它们不是复合索引的一部分,例如:
db.collection.ensureIndex( { a: 1 } )
db.collection.ensureIndex( { b: 1 } )
db.collection.find( { a: 2, b: 2 } )
我想知道是否可以扫描多个文档,或者Mongo DB是否会扫描任何内容并且explain()
将返回:
indexOnly: YES
答案 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
光标。