我有一个名叫工厂的集合。
在此集合中,有两种类型的查询将在名为工厂的集合中点击,如下所示
db.factories.find({ city: "New York", state: "NY"} );
db.factories.find({ city: "New York", state: "NY" , country:"US"} );
我的问题是,如果我创建一个如下所示的复合索引,它是否会同时提供查询?
db.factories.ensureIndex({city:1,state:1,country:1},{"unique" : false})
答案 0 :(得分:6)
是
要理解为什么答案是肯定的,我们需要讨论如何实际构建复合索引。
复合索引中的字段从第一个到最后一个,所有子项的值都嵌套在父项中。这意味着如果你有三个文件,如:
[{
_id:{},
a: 1,
b: 2,
c: 3
},{
_id:{},
a: 4,
b: 5,
c: 6
},{
_id:{},
a: 7,
b: 8,
c: 9
}]
并制作了一个索引:
db.collection.ensureIndex({a:1,b:1,c:1})
索引实际上看起来像:{1: [2,3]}
,第一个值是最左边的字段,另外两个是在最左边的值下出现的值。
当然这不是索引实际看起来的样子,我只是这样做是为了让每个人都能阅读。要了解索引是如何形成的,你可以看一些演示文稿,一个我找到好的作为一个总是要观察的事实就是这个:http://www.mongodb.com/presentations/storage-engine-internals关于存储内部。
所以这意味着MongoDB通过前缀方法选择这个索引,它会说a
和a,b
是索引的前缀,它可以使用这些字段来获取所有其他值需要从索引。
以这种方式进行前缀意味着如果查询的话,索引将不起作用:
db.collection.find({state:"NY",country:"YS"});
db.collection.find({state:"NY"});
db.collection.find({country:"YS"});
值得注意的是,查询中的顺序并不重要。您可以按照您喜欢的顺序创建查询中的字段,其中重要的是IN THE INDEX。
无论如何,这是查询将使用该单一索引的原因的入门读物。