mongodb - 为什么 Mongo 不能识别索引的非点版本?
问题描述
我在 Mongo 有一个这样的集合:
{
'key': {
'a': <value>,
'b': <value>
},
'data': <stuff>
}
它有一个索引key
:
db.collection.createIndex( { 'key.a': 1, 'key.b': 1 } )
现在我希望这两个查询都使用索引:
db.collection.find( { 'key.a': 13, 'key.b': 37 } )
db.collection.find( { 'key': {'a': 13, 'b': 37 } } )
但是,正如.explain()
语句所示,Mongo 将仅在第一个查询中使用索引 (IXSCAN) 而不是在第二个查询中(它使用 COLLSCAN)。
现在我很好奇,为什么 Mongo 不在查询的非虚线版本上使用索引?
解决方案
不知道为什么它没有正确使用索引(你使用的是什么版本的 MongoDB?),但是如果你提示它使用它们的索引。
> db.test.insert({"top" : { "key": { "a": 1, "b": 2}, "data" : "blahblah"}})
WriteResult({ "nInserted" : 1 })
> db.test.createIndex({ "key.a":1, "key.b" : 1 })
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.test.find( {"key" :{"a": 1, "b": 2}}).hint({"key.a":1, "key.b":1}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.test",
"indexFilterSet" : false,
"parsedQuery" : {
"key" : {
"$eq" : {
"a" : 1,
"b" : 2
}
}
},
"queryHash" : "281CFA9E",
"planCacheKey" : "281CFA9E",
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"key" : {
"$eq" : {
"a" : 1,
"b" : 2
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"key.a" : 1,
"key.b" : 1
},
"indexName" : "key.a_1_key.b_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"key.a" : [ ],
"key.b" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"key.a" : [
"[MinKey, MaxKey]"
],
"key.b" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "LAPTOP-O235KC41",
"port" : 27017,
"version" : "4.2.0",
"gitVersion" : "a4b751dcf51dd249c5865812b390cfd1c0129c30"
},
"ok" : 1
}
>