0

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

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

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

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

indexOnly: YES
4

1 回答 1

0

indexOnly只有当您要查找的所有值都在索引中(包括排序)时,解释才会返回。基本上它表示一个覆盖索引:http ://docs.mongodb.org/manual/applications/indexes/#create-indexes-that-support-covered-queries

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

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

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

  • 健康)状况
  • 投影
  • 种类

IE:

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

会使用indexOnly游标。

于 2013-01-12T19:42:52.760 回答