zoukankan      html  css  js  c++  java
  • MongoDB 大数据技术之mongodb中在嵌套子文档的文档上面建立索引

    一、给collection objectid赋自定义的值

    MongoDB Enterprise > db.testid.insert({_id:{imsi:"4567890123",address:"测试数据"}})

    MongoDB Enterprise > db.testid.createIndex({"_id.imsi":1})

    MongoDB Enterprise > db.testid.createIndex({"_id.address":1})

    MongoDB Enterprise > db.testid.createIndex({"_id:imsi":1,"_id.address":1})

     二、查询嵌套

    MongoDB Enterprise > db.testid.find().pretty()
    { "_id" : { "imsi" : "4567890123", "address" : "测试数据" } }
    { "_id" : { "imsi" : "4567890123", "address" : "测试数据", "id" : 123 } }

    MongoDB Enterprise > db.testid.find({"_id.imsi":"4567890123"})
    { "_id" : { "imsi" : "4567890123", "address" : "测试数据" } }
    { "_id" : { "imsi" : "4567890123", "address" : "测试数据", "id" : 123 } }

    三、转载文章

    本篇文章探讨了大数据技术之mongodb中在嵌套子文档的文档上面建立索引,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

    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

    }

    部分整理自:http://m.zhizuobiao.com/technique/technique-19041500114/

  • 相关阅读:
    搜索专题
    KMP专题
    CSU 1326: The contest(分组背包)
    强连通专题
    MST:Bad Cowtractors(POJ 2377)
    MST:Agri-Net(POJ 1258)
    ShortestPath:Layout(POJ 3169)(差分约束的应用)
    MST:Conscription(POJ 3723)
    MST:Roadblocks(POJ 3255)
    DP:Space Elevator(POJ 2392)
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/12050949.html
Copyright © 2011-2022 走看看