2

以 a 为例,find()它涉及一个字段,a并且b按顺序排列。例如,

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

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

[
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1"
},
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1,
        "c" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1_c_1"
}
]

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

4

2 回答 2

5

MongoDB 有一个查询优化器,可以选择最有效的索引。从文档

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

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

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

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

以下索引:

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

可以支持包含a, aandbaand band的查询c,但不仅bor c,或者只有band c

于 2014-07-13T08:53:04.923 回答
0

你和使用 $exist,, 当为 true 时,$exists 匹配包含该字段的文档,包括字段值为空的文档。如果为 false,则查询仅返回不包含该字段的文档。

$存在

查询将是

db.inventory.find( { "key.a": { $exists: true, 1 },"key.b": { $exists: true, 1 }  } )
于 2014-07-13T07:30:21.017 回答