【发布时间】:2015-12-02 19:11:52
【问题描述】:
我有一个包含两个字段的用户集合,结构如下。
"email":"dog@gmail.com"
"identities":[{"uid":"terrible","provider":"even_worse"}].
我在集合上创建了以下索引。基本上我有索引
1.“_id”上的索引:默认
2.关于“电子邮件”的索引:单独
3.关于“身份”的索引:单独
4.“_id”+“身份”的索引
5.“电子邮件”+“身份”的索引
rs0:PRIMARY> db.users.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test_development.users"
},
{
"v" : 1,
"key" : {
"email" : 1
},
"name" : "email_index",
"ns" : "test_development.users"
},
{
"v" : 1,
"key" : {
"identities.uid" : 1,
"identities.provider" : 1
},
"name" : "identities_index",
"ns" : "test_development.users"
},
{
"v" : 1,
"key" : {
"_id" : 1,
"identities.uid" : 1,
"identities.provider" : 1
},
"name" : "id_and_identities_index",
"ns" : "test_development.users"
},
{
"v" : 1,
"key" : {
"email" : 1,
"identities.uid" : 1,
"identities.provider" : 1
},
"name" : "email_and_identities_index",
"ns" : "test_development.users"
}
]
我在打开 explain() 的情况下执行以下查询:
db.users.find({ "email":"test@gmai.com","identities":{$elemMatch : {"uid":"cat", "provider": "dog"}}}).explain()
explain 的结果表明只使用了电子邮件索引,并且从不查询身份索引。我不知道如何解决这个问题。 任何帮助表示赞赏。
{
"cursor" : "BtreeCursor email_index",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 0,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 0,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"email" : [
[
"test@gmai.com",
"test@gmai.com"
]
]
},
"server" : "dragon:27017",
"filterSet" : false
}
我觉得我不需要这么多索引,但我阅读了文档和前缀索引部分,因此我创建了所有这些索引。我的程序中的一些其他查询需要索引 2、3、4,我希望索引 5 可以解决这个特定的查询。但是它不起作用。
问候, 理查德·麦德森
更新:使用提示让它发挥作用
db.users.find({ "email":"test@gmai.com","identities":{$elemMatch : {"uid":"cat", "provider": "dog"}}}).hint({"email":1, "identities.uid":1, "identities.provider":1})
这工作,使用索引,但我不明白为什么,我留下这个问题,希望有人可以解释工作。
【问题讨论】: