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]
"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}]}