首页 > 解决方案 > 为什么在 MonogoDB 中索引可以自动转换为多键?

问题描述

给定一个空集合testdoc,其索引如下

`db.testdoc.createIndex({"ratings.score": 1});`

然后插入一个文档db.testdoc.insert({_id: 3, ratings: {score: 23}})

查询db.testdoc.find({"ratings.score": 23}).explain()和获胜计划是

        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "ratings.score" : 1
                },
                "indexName" : "ratings.score_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "ratings.score" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "ratings.score" : [
                        "[23.0, 23.0]"
                    ]

isMultiKey是假的。

但是,插入此文档后db.testdoc.insert({_id: 1,item: "ABC",ratings: [ { score: 2, by: "mn" }, { score: 9, by: "anon" } ]})

上述查询的获胜计划是

        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "ratings.score" : 1
                },
                "indexName" : "ratings.score_1",
                "isMultiKey" : true,
                "multiKeyPaths" : {
                    "ratings.score" : [
                        "ratings"
                    ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "ratings.score" : [
                        "[23.0, 23.0]"
                    ]
                }

现在isMultiKey是真的。

为什么更改文档结构时可以将索引更改为 isMultiKey?

MongoDB版本:4.2.5

标签: mongodbindexing

解决方案


默认情况下,如果您在现有数组字段上创建索引,MongoDB 将创建多键索引,即;数组中每个元素的多个索引键。假设在您的情况下,即使您最初创建了一个普通的单字段索引,稍后如果您添加一个带有索引字段作为数组的新文档,那么 MongoDB 会自动将现有索引转换为多键索引,因为数组是为该特定字段插入。

参考: 多键索引


推荐阅读