MongoDB-多键索引

多键索引

多键索引是专门针对数组字段的, 会为数组字段的每一个元素都创建一个索引。

?> 插入测试数据:

db.person.insert([
{name:'as', age:18, tags:['ahtml', 'bcss']},
{name:'bs', age:17, tags:['cjs', 'enode']},
{name:'cs', age:19, tags:[ 'dvue', 'freact']},
])

首先来看看我们没有创建多键索引之前的查询效果:

db.person.explain().find({'tags':{$in:['ahtml']}})

从如下结果集返回来看,是一个全表扫描的情况:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.person",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "tags" : {
                "$eq" : "ahtml"
            }
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "tags" : {
                    "$eq" : "ahtml"
                }
            },
            "direction" : "forward"
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "LAPTOP-A8CAC6IT",
        "port" : 27017,
        "version" : "4.0.28",
        "gitVersion" : "af1a9dc12adcfa83cc19571cb3faba26eeddac92"
    },
    "ok" : 1
}

创建多键索引:

db.person.createIndex({tags:1})

再次进行查询:

db.person.explain().find({'tags':{$in:['ahtml']}})

返回结果:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.person",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "tags" : {
                "$eq" : "ahtml"
            }
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "tags" : 1
                },
                "indexName" : "tags_1",
                "isMultiKey" : true,
                "multiKeyPaths" : {
                    "tags" : [
                        "tags"
                    ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "tags" : [
                        "[\"ahtml\", \"ahtml\"]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "LAPTOP-A8CAC6IT",
        "port" : 27017,
        "version" : "4.0.28",
        "gitVersion" : "af1a9dc12adcfa83cc19571cb3faba26eeddac92"
    },
    "ok" : 1
}

很明显是通过索引进行命中对应的数据。

在我们创建了对应了多键索引之后,我们插入的测试数据对应的数据结构大概的体系结构如下可以进行稍微了解了解:

'ahtml' -> {name:'as', age:18, tags:['ahtml', 'bcss']}
'bcss' -> {name:'as', age:18, tags:['ahtml', 'bcss']}
'cjs' -> {name:'bs', age:17, tags:['cjs', 'enode']}
'dvue' -> {name:'cs', age:19, tags:[ 'dvue', 'freact']}
'enode' -> {name:'bs', age:17, tags:['cjs', 'enode']}
'freact' -> {name:'cs', age:19, tags:[ 'dvue', 'freact']}
posted @   BNTang  阅读(296)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示