mongodb中在嵌套子文档的文档上面建立索引
admin
2023-01-26 07:23:53
0
  1. 在mongodb的test库:

> db.data.insert({name:"1616",info:{url:"http://www.1616.net/",city:"beijing"}});

> db.data.insert({name:"hao123",info:{url:"http://www.hao123.com/",city:"beijing"}});

> db.data.insert({name:"ll4la",info:{url:"http://www.114la.com/",city:"dongguan"}});


2.对字段 info 创建索引:

> db.data.ensureIndex({info: 1});


3.data表的索引查询:

rs0:PRIMARY> db.data.getIndexes()

[

        {

                "v" : 1,

                "key" : {

                        "_id" : 1

                },

                "name" : "_id_",

                "ns" : "test.data"

        },

        {

                "v" : 1,

                "key" : {

                        "info" : 1

                },

                "name" : "info_1",

                "ns" : "test.data"

        }

]

4.索引的用法:

以下查询是可以用到info的索引的:

>db.data.find({info: {url:"http://www.1616.net/", city:"beijing"}});

>db.data.find({info: {url:"http://www.1616.net/"} });

>db.data.find({info: {city:"beijing"});

可以使用query.explain()查看索引的使用:

    

rs0:PRIMARY> db.data.find({info: {city:"beijing"}}).explain()

{

        "queryPlanner" : {

                "plannerVersion" : 1,

                "namespace" : "test.data",

                "indexFilterSet" : false,

                "parsedQuery" : {

                        "info" : {

                                "$eq" : {

                                        "city" : "beijing"

                                }

                        }

                },

                "winningPlan" : {

                        "stage" : "FETCH",

                        "inputStage" : {

                                "stage" : "IXSCAN",

                                "keyPattern" : {

                                        "info" : 1

                                },

                                "indexName" : "info_1",

                                "isMultiKey" : false,

                                "isUnique" : false,

                                "isSparse" : false,

                                "isPartial" : false,

                                "indexVersion" : 1,

                                "direction" : "forward",

                                "indexBounds" : {

                                        "info" : [

                                                "[{ city: \"beijing\" }, { city: \"beijing\" }]"

                                        ]

                                }

                        }

                },

                "rejectedPlans" : [ ]

        },

        "serverInfo" : {

                "host" : "mycentos.WORKGROUP",

                "port" : 27017,

                "version" : "3.2.8",

                "gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"

        },

        "ok" : 1

}


但是这样的查询就不行:

>db.data.find({"info.city":"beijing"});    //字段部分必须加引号

>db.data.find({info.url:"..."});

这样的查询语句,只能使用类似的组合索引:

> db.data.ensureIndex({"info.url":1, "info.city":1});


5.组合索引

> db.data.ensureIndex({"info.url":1, "info.city":1});

即使查询时,与定义的排序相反,也是可以使用索引扫描的。

rs0:PRIMARY> db.data.find({"info.url": /http:*/i}).sort({"info.url": -1, "info.city":-1}).explain()

{

        "queryPlanner" : {

                "plannerVersion" : 1,

                "namespace" : "test.data",

                "indexFilterSet" : false,

                "parsedQuery" : {

                        "info.url" : /http:*/i

                },

                "winningPlan" : {

                        "stage" : "FETCH",

                        "inputStage" : {

                                "stage" : "IXSCAN",

                                "filter" : {

                                        "info.url" : /http:*/i

                                },

                                "keyPattern" : {

                                        "info.url" : 1,

                                        "info.city" : 1

                                },

                                "indexName" : "info.url_1_info.city_1",

                                "isMultiKey" : false,

                                "isUnique" : false,

                                "isSparse" : false,

                                "isPartial" : false,

                                "indexVersion" : 1,

                                "direction" : "backward",

                                "indexBounds" : {

                                        "info.url" : [

                                                "[/http:*/i, /http:*/i]",

                                                "({}, \"\"]"

                                        ],

                                        "info.city" : [

                                                "[MaxKey, MinKey]"

                                        ]

                                }

                        }

                },

                "rejectedPlans" : [ ]

        },

        "serverInfo" : {

                "host" : "mycentos.WORKGROUP",

                "port" : 27017,

                "version" : "3.2.8",

                "gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"

        },

        "ok" : 1

}


相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...