1. 程式人生 > >mongoDB學習筆記四

mongoDB學習筆記四

第五章 索引

>db.users.find({"username":"retacn yue"})

{ "_id" : ObjectId("586b40507dfc144b68de4071"),"relationships" : { "enemies" : 2, "friend" : 32}, "username" : "retacn yue", "age" : 33,"sex" : "ma

le", "location" :"ZiBo", "emails" : [ "[email protected]","[email protected]", "[email protected]

", "[email protected]"], "state" : null,

"languages" : [ "java","python", "c", "c++" ] }

>db.users.ensureIndex({"username":1})

{

       "createdCollectionAutomatically" : false,

       "numIndexesBefore" : 1,

       "numIndexesAfter" : 2,

       "ok" : 1

}

擴充套件索引

建立索引需要考慮以下問題

1 作什麼查詢,哪些鍵要索引

2 索引方向

3 擴充套件中鍵的排列

索引內嵌文件中的鍵

> db.blog.posts.findOne()

{

       "_id" : ObjectId("586f21115da1e3bac2c373fe"),

       "title" : "A blog post",

       "content" : "...",

       "author" : {

                "name" : "retacnyue",

                "email" :"[email protected]"

       },

       "comments" : [

                {

                        "name" :"yue",

                        "email" :"[email protected]",

                        "content" :"good",

                        "votes" : 11

                },

                {

                        "name" :"three",

                        "email" :"[email protected]",

                        "content" :"better",

                        "votes" : 8

                },

                {

                        "name" :"zhenhua",

                        "email" :"[email protected]",

                        "content" :"best",

                        "votes" : 11

                }

       ]

}

> db.users.ensureIndex({"author.name":1})

{

       "createdCollectionAutomatically" : false,

       "numIndexesBefore" : 2,

       "numIndexesAfter" : 3,

       "ok" : 1

}

為排序建立索引

無索引的排序,當集合大到不能在記憶體中排序,mongodb就會報錯

索引名稱

索引名形式:

Keyname1_dir1_keyname2_dir2_...keynameN_dirN

自定義索引名稱

>db.users.ensureIndex({"location":1},{"location":"seq_location"})

{

       "createdCollectionAutomatically" : false,

       "numIndexesBefore" : 3,

       "numIndexesAfter" : 4,

       "ok" : 1

}

二唯一索引

確保文件中的username鍵都有一個唯一值,可以建立唯一索引

>db.users.ensureIndex({"age":1},{"unique":true})

{

       "createdCollectionAutomatically" : false,

       "numIndexesBefore" : 4,

       "numIndexesAfter" : 5,

       "ok" : 1

}

修改索引

#刪除指定鍵的索引

> db.runCommand({"dropIndexes":"users","index":"username_1"})

{ "nIndexesWas" : 5,"ok" : 1 }

>db.runCommand({"dropIndexes":"users","index":"location_1"})

{ "nIndexesWas" : 4,"ok" : 1 }

#刪除所有索引

>db.runCommand({"dropIndexes":"users","index":"*"})

{

       "nIndexesWas" : 3,

       "msg" : "non-_id indexes dropped for collection",

       "ok" : 1

}

消除重複

如果在建立索引前,資料庫中已經有重複的鍵值,如果想要將重複的文件值全部刪除,可以作如下操作

#新增使用者名稱重複的鍵值

>db.users.insert({"username":"retacn yue"})

WriteResult({ "nInserted" : 1 })

#查詢所有記錄

> db.users.find()

{ "_id" :ObjectId("586b40507dfc144b68de4071"), "relationships" : {"enemies" : 2, "friend" : 32 }, "username" :"retacn yue", "age" : 33, "sex" : "ma

le", "location" :"ZiBo", "emails" : [ "[email protected]","[email protected]", "[email protected]","[email protected]" ], "state" : null,

"languages" : [ "java","python", "c", "c++" ] }

{ "_id" :ObjectId("58708a439193775a5f6b5f14"), "username" :"ann", "age" : 30, "sex" : "female","location" : "BoShan", "relationships" : {"enemies"

 : 1,"friend" : 20 }, "emails" : [ "[email protected]","[email protected]" ], "state" : "T","languages" : [ "java", "python", "c++"] }

{ "_id" :ObjectId("58708aeb9193775a5f6b5f16"), "username" :"mike", "age" : 15, "sex" : "male","location" : "HuanTai", "relationships" : {"enemies"

 : 3,"friend" : 18 }, "emails" : [ "[email protected]","[email protected]" ], "state" : "F","languages" : [ "java", "c++" ] }

{ "_id" :ObjectId("58708e5e9193775a5f6b5f18"), "username" :"andy", "age" : 18, "sex" : "female","location" : "ZhangDian", "relationships" : {"enem

ies" : 2, "friend" : 15 },"emails" : [ "[email protected]", "[email protected]" ],"state" : "T", "languages" : [ "java","c", "c++" ] }

{ "_id" :ObjectId("5871d6cbc1be409ee45a7899"), "username" :"retacn yue" }

#這時建立唯一索引失敗

>db.users.ensureIndex({"username":1},{"unique":true})

{

       "ok" : 0,

       "errmsg" : "E11000 duplicate key error collection:test.users index: username_1 dup key: { : \"retacn yue\" }",

       "code" : 11000

}

#如果想保留第一個文件,刪除後面的重得文件,可以作如下操作

在mongodb在3.0後不建議使用

>db.users.ensureIndex({"username":1},{"unique":true,"dropDups":true})

複合唯一索引,單個健的值可以相同,只要鍵的組合不同就好

使用explain和hint

#會返回查詢所使用的索引情況

#在建立索引前

>db.users.find({"username":"retacn yue"}).explain()

{

       "queryPlanner" : {

                "plannerVersion" : 1,

                "namespace" :"test.users",

                "indexFilterSet" :false,

                "parsedQuery" : {

                        "username" :{

                                "$eq": "retacn yue"

                       }

                },

                "winningPlan" : {

                        "stage" :"COLLSCAN",

                        "filter" : {

                               "username" : {

                                       "$eq" : "retacn yue"

                                }

                        },

                        "direction" :"forward"

                },

                "rejectedPlans" : [ ]

       },

       "serverInfo" : {

                "host" :"retacn",

               "port" : 27017,

                "version" :"3.2.11",

                "gitVersion" :"009580ad490190ba33d1c6253ebd8d91808923e4"

       },

       "ok" : 1

}

#在建立索引後

>db.users.find({"username":"retacn yue"}).explain()

{

       "queryPlanner" : {

                "plannerVersion" : 1,

                "namespace" :"test.users",

                "indexFilterSet" :false,

                "parsedQuery" : {

                        "username" :{

                                "$eq": "retacn yue"

                        }

                },

                "winningPlan" : {

                        "stage" :"FETCH",

                        "inputStage": {

                               "stage" : "IXSCAN",

                                "keyPattern": {

                                       "username" : 1

                                },

                               "indexName" : "username_1",

                               "isMultiKey" : false,

                               "isUnique" : false,

                               "isSparse" : false,

                               "isPartial" : false,

                               "indexVersion" : 1,

                               "direction" : "forward",

                                "indexBounds": {

                                       "username" : [

                                               "[\"retacn yue\", \"retacn yue\"]"

                                        ]

                                }

                        }

                },

                "rejectedPlans" : [ ]

       },

       "serverInfo" : {

                "host" :"retacn",

                "port" : 27017,

                "version" :"3.2.11",

                "gitVersion" :"009580ad490190ba33d1c6253ebd8d91808923e4"

       },

       "ok" : 1

}

四索引的管理

索引的元資訊儲存在system.indexes集合中,不能進行插入和刪除文件的操作

可以使用ensureIndex和dropIndex進行

修改索引

#建立索引的工作在後臺完成

>db.users.ensureIndex({"username":1},{"background":true})

{

       "createdCollectionAutomatically" : false,

       "numIndexesBefore" : 1,

       "numIndexesAfter" : 2,

       "ok" : 1

}

檢視索引,刪除索引

#檢視當前資料庫中建立的索引

> db.users.getIndexes()

[

       {

                "v" : 1,

                "key" : {

                        "_id" : 1

                },

                "name" :"_id_",

                "ns" :"test.users"

       },

       {

                "v" : 1,

                "key" : {

                        "username" :1

                },

                "name" :"username_1",

                "ns" :"test.users",

                "background" : true

       }

]

五地理空間索引

比如果查詢離當前位置最近的n個場所,mongodb建立了專門的索引,地理空間索引

db.map.ensureIndex({“gps”:”2d”})

Gps的鍵值必須是一對值

{“gps”:{1,100}}

{“gps”:{“x”:20,”y”:30}}

也可以指定最大值,最小值

db.map.ensureIndex({“gps”:”2d”},{“min”:-100,”max”:100})

查詢時可以使用$near

Db.map.find({“gps”:{“$near”:[10,20]}}).limit(10)

也可以使用geoNear來完成同上操作

db.runCommand({geoNear:”map”,near:[10,20],num:10})

也可以找到指定形狀內的文件,box第一個元素指定了左下角的座標,第二個元素指定右上角的座標

Db.map.find({“gps”:{“$within”:{“$box”:[[10,20][15,30]]}}})

也可以用來查詢圓內的所有點

Db.map.find({“gps”:{“$within’:{“$center”:[12,25],5}}})

複合地理空間索引

例如查詢附近的咖啡店,可以將地理空間索引與普通索引組合起來

#建立索引

db.map.ensureIndex({“location”:”2d”,”desc”:1})

#查詢

Db.map.find({“location”:{“$near”:[70,30]},”desc”:”coffeeshop”}).limit(1)

相關推薦

MongoDB 學習筆記 C#呼叫MongoDB

驅動 C#/.NET Driver Version MongoDB 2.4 MongoDB 2.6 MongoDB 3.0 Version 2.0 ✓ ✓

MongoDB學習筆記()——MongoDB基礎定義

do,don't,won't,can't,shouldn't,say,this,they,at,but,we,his,from,not,by,she,or,as,what,go,their,can,who,get,if,would,her,all,my,make,about,know,will,up,one,

mongoDB學習筆記

第五章 索引 >db.users.find({"username":"retacn yue"}) { "_id" : ObjectId("586b40507dfc144b68de4071"),"relationships" : { "enemies" : 2, "fr

mongo學習筆記Mongodb的三種叢集(Replica Set)

cfg是可以任意的名字,當然最好不要是mongodb的關鍵字,conf,config都可以。最外層的_id表示replica set的名字,members裡包含的是所有節點的地址以及優先順序。優先順序最高的即成為主節點,即這裡的192.168.1.131:27017。特別注意的是,對於仲裁節點,需要有個特別的

如何輸出格式化的字符串(學習筆記

linux python 格式化整數 浮點數 如何輸出格式化的字符串(學習筆記四)我們經常會輸出類似 ‘親愛的xxx你好!你xx月的話費是xx,余額是xx‘ 之類的字符串,而xxx的內容都是根據變量變化的,所以,需要一種簡便的格式化字符串的方式。在Python中,采用的格式化方式和C語言是一致的,

cocos2d-x-3.1 國際化strings.xml解決亂碼問題 (coco2d-x 學習筆記)

source ron 文件 亂碼問題 resource -s type fileutil ani 今天寫程序的時候發現輸出文字亂碼,盡管在實際開發中把字符串寫在代碼裏是不好的做法。可是有時候也是為了方便,遇到此問題第一時間在腦子裏面聯想到android下的strings

【Unity 3D】學習筆記十二:粒子特效

空間 獲得 material package 一個 log 創建 spa mpi 粒子特效 粒子特效的原理是將若幹粒子無規則的組合在一起。來模擬火焰,爆炸。水滴,霧氣等效果。要使用粒子特效首先要創建,在hierarchy視圖中點擊create——particle s

Tomcat學習筆記()

客服 list illegal state oid () ons mov tom Servlet容器部分 servlet容器用來處理請求servlet資源,並為web客服端填充response對象模塊,在tomcat中,共有4種類型的容器,分別是:Engi

mongoDB學習筆記(一)

介紹 tle 狀態 負載 tutorial dir 基於 管理 集合 說明: MongoDB由databases組成,database由collections組成,collection由documents組成,document由fileds組成。MongoDB是異步寫數據

MongoDB學習筆記(二)

.get 條件過濾 條件 $set system.in ins version tle 不存在 一、Mongodb命令 說明:Mongodb命令是區分大小寫的,使用的命名規則是駝峰命名法。 對於database和collection無需主動創建,在插入數據時,如果dat

MongoDB學習筆記—常用命令

upd 鍵值 操作 false doc cer 查看 數據庫 創建 這裏記錄一下MongoDB常用的命令 數據庫相關 創建數據庫 use DATABASE_NAME 如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。 刪除數據庫:切換到要刪除的數據庫下,執行

JavaWeb學習筆記 request&response

cer 代碼 gbk msi 抓包工具 rom service net war HttpServletResponse 我們在創建Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個為代表請求的request和代表響

MongoDB 學習筆記之 權限管理基礎

顯示 命令 修改 技術 sky 需要 bad 官方 改密碼 權限管理基礎 MongoDB有很多用戶roles,這裏只是簡單列舉下命令的使用,具體的role的含義,請查閱官方文檔。 https://docs.mongodb.com/manual/reference/bui

MongoDB 學習筆記之 分片和副本集混合運用

comment ssm table mmap insert ise class 學習 urn 分片和副本集混合運用: 基本架構圖: 搭建詳細配置: 3個shard + 3個replicat set + 3個configserver + 3個Mongos sh

MongoDB 學習筆記之 手動預先分片

var http strong str 可見 mongod 手動 ++ 1-1 手動預先分片: 目的:手動預先分片是為了防止未來chunk的移動,減少IO。 sh.shardCollection("shop.users",{"userId": 1 }) for(v

mongodb 學習筆記

mongodb1. 登陸MongoDB下面這個命令用於登錄MongoDB數據庫。請確保在數據庫dbname中存在對應用戶的憑據(比如,用戶名和密碼)。mongo -u <username> -p <password> --authenticationDatabase <dbnam

java 核心學習筆記() 單例類

com null tools 初始化 equal inf div 特殊 對象 如果一個類始終只能創建一個實例,那麽這個類被稱作單例類。 一些特殊的應用場景可能會用到,為了保證只能創建一個實例,需要將構造方法用private修飾,不允許在類之外的其它地方創建類的實例。 又要保

MongoDB 學習筆記之 TTL索引,部分索引和文本索引

強制 類型 支持 行存儲 pan 事件 搜索 篩選 ext TTL索引: TTL集合支持mongodb對存儲的數據進行失效時間設置,經過指定的時間段後、或在指定的時間點過期,集合自動被mongod清除。這一特性有利於對一些只需要保存一定時間的數據信息進行存儲,比如機器產生

MongoDB 學習筆記之 地理空間索引入門

geometry 分享 如果 sphere mce insert del sap 計劃 地理空間索引: 地理空間索引,可用於處理基於地理位置的查詢。 Point:用於指定所在的具體位置,我們以restaurants為例: db.restaurants.insert({

MongoDB 學習筆記之 $or與索引關系

其中 沒有 默認 ont mes exp style explain alt $or與索引關系: 對leftT集合的timestamp創建索引 執行$or語句:db.leftT.find({$or: [{ "timestamp" : 5},{"age": 10}]}