如果有多个索引包含相同的字段,将使用哪个索引?

时间:2014-07-13 07:18:35

标签: mongodb mongodb-query mongodb-indexes

例如,按此顺序使用涉及字段find()a的{​​{1}}。例如,

b

我的集合索引数组中有两个键:

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}})

保证 mongo会使用第一个密钥,因为它更准确地匹配查询,还是随机选择两个密钥中的任何一个,因为它们都可以工作?

2 个答案:

答案 0 :(得分:5)

MongoDB有一个查询优化器,可以选择最有效的索引。来自docs

  

MongoDB查询优化器处理查询并选择最多   给定可用索引的查询的有效查询计划。

所以它没有严格保证(但我希望较小的指数会比较大的复合指数更快地产生结果)。 您还可以使用hint运算符强制查询优化器使用指定的索引。

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}}).hint({a:1, b:1});

但是,您示例中的这两个索引是多余的。这是因为复合索引支持对任何prefix of index字段的查询。

以下索引:

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

可以支持包含aab以及ab以及c的查询,但不是< / em>仅bc,或仅bc

答案 1 :(得分:0)

您并使用$ exist ,,如果为true,则$ exists匹配包含该字段的文档,包括字段值为null的文档。如果为false,则查询仅返回不包含该字段的文档。

$exist

查询将是

db.inventory.find( { "key.a": { $exists: true, 1 },"key.b": { $exists: true, 1 }  } )