复合索引可以提供多个查询

Paw*_*wan 11 mongodb

我有一个名称工厂的集合.

在此集合中,将有两种类型的查询将在名为工厂的集合中命中 ,如下所示

db.factories.find({ city: "New York", state: "NY"} );


db.factories.find({ city: "New York", state: "NY" , country:"US"} );
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我创建一个如下所示的复合索引,它是否会同时提供查询?

db.factories.ensureIndex({city:1,state:1,country:1},{"unique" : false})
Run Code Online (Sandbox Code Playgroud)

Sam*_*aye 6

是.

要理解为什么答案是肯定的,我们需要讨论如何实际构建复合索引.

复合索引中的字段从第一个到最后一个,所有子项的值都嵌套在父项中.这意味着,如果你有三个文件,如:

[{
    _id:{},
    a: 1,
    b: 2,
    c: 3
},{
    _id:{},
    a: 4,
    b: 5,
    c: 6
},{
    _id:{},
    a: 7,
    b: 8,
    c: 9
}]
Run Code Online (Sandbox Code Playgroud)

并做了一个索引:

db.collection.ensureIndex({a:1,b:1,c:1})
Run Code Online (Sandbox Code Playgroud)

索引实际上看起来像:{1: [2,3]}第一个值是最左边的字段,另外两个是在最左边的值下发生的值.

当然这不是索引实际看起来的样子,我只是这样做是为了让每个人都能阅读.要了解索引是如何形成的,您可以观看一些演示文稿,我发现这是一个很好的事实,总是会看到这个:http://www.mongodb.com/presentations/storage-engine-internals on storage internals.

所以这意味着MongoDB通过前缀方法来选择这个索引,它会说它a并且a,b是索引的前缀,它可以使用这些字段来获取索引所需的所有其他值.

以这种方式进行前缀意味着如果查询的话索引将不起作用:

db.collection.find({state:"NY",country:"YS"});
db.collection.find({state:"NY"});
db.collection.find({country:"YS"});
Run Code Online (Sandbox Code Playgroud)

值得注意的是,查询中的顺序并不重要.您可以按照您喜欢的顺序创建查询中的字段,其中重要的是IN THE INDEX.

无论如何,这是查询将使用该单个索引的原因的入门读物.