无论其他人回答的是什么,对于索引的低效使用都是正确的,但在解释计划中它仍应该显示为IXSCAN,因此我进行了一项测试。
db.sampledb.createIndex(
{
"DevIdent.ParametersExt. ID": 1,
"DevIdent.Parameters.Type": 1,
"MetaData.SessionName": 1
},
{
background: false,
name: "sample",
}
)
这是您的命令,
DevIdent.ParametersExt. & ID
之间有一些空格,导致问题,但如果没有空格,您仍然无法创建新索引,会出现重复错误。完全删除此索引,并创建一个没有空格的新索引。
编辑:初中生错误,请删除名称部分,您应该能够创建两个索引,在树中,字段名称只是存储在相应BSON类型中的字符串,因此带空格和不带空格是两个单独的索引。
db.sampledb.createIndex(
{
"DevIdent.ParametersExt.ID": 1,
"DevIdent.Parameters.Type": 1,
"MetaData.SessionName": 1
},
{
background: false,
name: "sample",
}
)
现在尝试使用聚合命令,对我有效。
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test_content.test4",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"MetaData.SessionName" : {
"$eq" : "2021_02_09_13_31_03"
}
},
{
"DevIdent.ParametersExt.ID" : {
"$regex" : ".*22~44.*"
}
},
{
"DevIdent.Parameters.Type" : {
"$not" : {
"$eq" : "TYPICAL"
}
}
}
]
},
"optimizedPipeline" : true,
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"filter" : {
"DevIdent.ParametersExt.ID" : {
"$regex" : ".*22~44.*"
}
},
"keyPattern" : {
"DevIdent.ParametersExt.ID" : 1.0,
"DevIdent.Parameters.Type" : 1.0,
"MetaData.SessionName" : 1.0
},
"indexName" : "sample",
"isMultiKey" : false,
"multiKeyPaths" : {
"DevIdent.ParametersExt.ID" : [],
"DevIdent.Parameters.Type" : [],
"MetaData.SessionName" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"DevIdent.ParametersExt.ID" : [
"[\"\", {})",
"[/.*22~44.*/, /.*22~44.*/]"
],
"DevIdent.Parameters.Type" : [
"[MinKey, \"TYPICAL\")",
"(\"TYPICAL\", MaxKey]"
],
"MetaData.SessionName" : [
"[\"2021_02_09_13_31_03\", \"2021_02_09_13_31_03\"]"
]
}
}
},