是的。
要理解为什么答案是肯定的,我们需要讨论复合索引是如何实际构建的。
复合索引中的字段从第一个到最后一个,其中包含嵌套在父级中的所有子级的值。这意味着如果您有三个文件,例如:
[{
_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 on storage internals。
所以这意味着 MongoDB 通过前缀方法来选择这个索引,它会说a
和a,b
是索引的前缀,它可以使用这些字段从索引中获取所有其他需要的值。
以这种方式添加前缀意味着如果您查询以下内容,索引将不起作用:
db.collection.find({state:"NY",country:"YS"});
db.collection.find({state:"NY"});
db.collection.find({country:"YS"});
值得注意的是,查询中的顺序并不重要。您可以使查询中的字段按您喜欢的任何顺序排列,重要的是在索引中。
无论如何,这是查询将使用该单个索引的原因的入门。