我有一个名称工厂的集合.
在此集合中,将有两种类型的查询将在名为工厂的集合中命中 ,如下所示
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)
是.
要理解为什么答案是肯定的,我们需要讨论如何实际构建复合索引.
复合索引中的字段从第一个到最后一个,所有子项的值都嵌套在父项中.这意味着,如果你有三个文件,如:
[{
_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.
无论如何,这是查询将使用该单个索引的原因的入门读物.
归档时间: |
|
查看次数: |
223 次 |
最近记录: |