分享

學習筆記表格方式整理 | 大中华官方唯一支持

 邵飞翔 2017-08-07

查詢選擇器(預設首碼為db.test.)

語句

說明

備註

find()

查詢全部資料

預設每200ms將資料flush到硬碟

find({id:1})

精確查詢

find({id:{$lt:5})

id小於5的全部資料

同樣的還有$lte(小於等於)、$lt(小於)、$gt(大於)、$gte(大於等於)

find({id:[1,2]})

某個範圍內

$nin(不在某個範圍內,低效,會使索引失效)、$ne(不等於,低效,會使索引失效)

find({$or:[{id:1},{id:2}]}

等同sql or

$and(等同於sql and,find({$and:[{id:1},{name:"xiaoming"}]}))

find({id:{$existis:false}})

返回存在/不存在某個欄位的全部資料

find({‘detail.1.post‘:5})

返回屬性detail的第二個元素中post為5的數據

find({id:1},{_id:0,id:1,name:1})

查詢id為1的資料並只返回id和name,0不現實,1顯示

find({}).sort({id:-1})

查詢所有資料並按id降冪,1昇冪

大資料量時排序欄位必須建立索引

find({}).skip(1).limit(4).sort({id:-1})

查詢所有資料並按id降冪,且跳過前1行開始返回4條資料

儘量不要使用skip,性能差

find({array:[1,2]})

精確匹配陣列array為[1,2]的資料

find({array:1}) 查找所有陣列中包含1的資料 find({"array.0":1}) 查找所有資料第一個元素為1的資料

find({array:[1,2]},{_id:0,"status.info":1})

精確匹配陣列array為[1,2]的資料並返回status屬性的info欄位

映射欄位同樣可用陣列方式find({array:[1,2]},{_id:0,"status.0.info":1})

find({},{array:{"$slice":-1},"array.desc":0})

返回陣列array的最後一個元素

索引及查詢優化

ensureIndex({name:1},{unique:true})

為欄位name建立唯一索引(該欄位值必須唯一)unique:false為普通索引

db.system.indexes.find()查看索引, 如果對陣列建立索引,那麼陣列中的每個元素都會建立索引

find().explain()

解釋查詢語句

ensureIndex({name:1,age:1})

為欄位name和age建立複合索引

dropIndex("name")

刪除name索引

db.setProfilingLevel(1)

開啟資料庫監視功能,0關閉,1記錄慢查詢。2記錄所有,所有監視結果都在system.profile中

增刪改操作

insert({id:1,name:"xiaoming",age:2})

添加一條數據

集合不存在自動創建 如果不顯示指定_id則自動創建

update({query,update,<upsert>,<multi>

query:查詢準則 update:更新內容 upsert:是否查不到資料就插入 multi:是否只匹配第一個找到的資料

update({id:1},{$set:{name:"zhangsan"},$inc:{age:12}})將集合中id為1的name改成zhangsan,age在原基礎上增加12 update({id:1},{name:"zhangsan",age:12})將集合中id為1的name改成zhangsan,age改成12並清除其他欄位(區別在於是否有操作符如$set)

remove(<query>,<justone>)

刪除資料 無參時,刪除全部資料,不刪除索引(資料為物理刪除) 只有query的時候刪除所有匹配的資料 有justone的時候刪除匹配的第一個文檔

高級特性

管道聚集

$match 過濾文檔只傳遞匹配的文檔到管道中的下一個步驟 $limit  限制管道中文檔的數量 $skip  跳過指定數量的文檔,返回剩下的文檔 $sort  對所有輸入的文檔進行排序 $group  對所有的文檔進行分組然後計算聚集結果 $first 返回group操作後的第一個值 $last 返回group操作後的最後一個值 $max 返回group操作後的最大值 $min 返回group操作後的最小值 $avg 返回group操作後的平均值 $sum 回group操作後的所有值的和 $out  將管道中的文檔輸出到一個具體的集合中,這個必須是管道操作的最後一步

db.test.aggregate([            {             $match:{status:"normal"}             },             {              $group:{_id:null,count:{$sum:1}}             } ])

mapreduce聚集

db.test.mapreduce(  //map  function(){   emit(this.id,this.age);  },  //reduce  function(key,values){   return Array.sum(values);  },  //query  {   query:{status:"normal"},   outresult:"result"  } )

簡單聚集

distinct("name") 去重 find().count() 統計 group 分組 sql:select _id,sum(value) count csum from coll where _id<3 group by _id group(  {   key:{_id:1},   cond:{_id:{$lt:3}},   reduce:function(cur,result){    result.count+=cur.value   },   initial:{count:0}  } )統計_id小於3,按照_id分組求value值的和

key:用來分組文檔的欄位。和keyf兩者必須有一個 keyf:可以接受一個javascript函數。用來動態的確定分組文檔的欄位。和key兩者必須有一個 initial:reduce中使用變數的初始化 reduce:執行的reduce函數。函數需要返回值。 cond:執行過濾的條件。 finallize:在reduce執行完成,結果集返回之前對結果集最終執行的函數。可選的 sql:select a,b,sum(c) csum from coll where active=1 group by a,b db.coll.group(            {key: { a:true, b:true },             cond: { active:1 },             reduce: function(obj,prev) { prev.csum += obj.c; },             initial: { csum: 0 }             }); group和distinct返回的結果集不能大於16mb,不能在分片集群上進行操作且group不能處理超過10000個唯一鍵值,超過這個限制只能使用管道或者mapreduce

複製集

三節點組成,一個主節點,一個從節點,一個哨兵節點,哨兵節點不存儲任何資料,只負責管理和處理故障時發生的問題

分片

同redis分片,mysql分區。三台獨立mongo,每個可做複製集。每台都有一個configure伺服器,一台路由伺服器 啟動configure伺服器 啟動mongos路由伺服器 啟動分片伺服器 使用sh.addshard添加分片到路由伺服器 注:集合設置分片才能進行分片,且片鍵上必須有索引sh.enablesharding("test")  當chunk不平衡時自動啟動平衡器

所有用戶端通過連接路由伺服器來連接資料庫 不包含索引和片鍵的查詢會查詢所有資料 只包含片鍵的會只查詢片鍵歸屬的一個片上的所有資料 包含片鍵和索引的會查詢片鍵歸屬的片並按索引高效查詢 不能使用昇冪欄位做片鍵 不推薦使用隨機欄位做片鍵 不推薦範圍有限的欄位做片鍵 片鍵應具有分發寫操作、讀操作不能太過隨機化(儘量局部化)、要保證chunk一只能被分割的特性,故此片鍵通常需要有幾個欄位進行組合,如_id和city

檔案系統

小於16mb的檔可直接轉化成二進位存儲 gridfs默認切割成每個256kb的小塊

監控及管理

導入匯出

mongoexport、mongoimport

備份恢復

mongodump、mongorestore

集群備份:禁用平衡器、停止每個片上的second節點和配置伺服器、備份,重啟複製集成員、重啟平衡器 集群恢復:停止所有實例、恢復每個片中的資料、恢復配置伺服器、重啟所有實例、執行db.printshardingstatus()確保集群是可操作的

資料庫監控

mongostat、mongotop、serverstatus、stats

web控制台監控

埠號28017,2.6以前默認啟動,之後默認關閉,啟動時加入參數httpinterfacetrue開啟

許可權

啟動時加入auth=true 用戶-角色(一對多)-許可權(一對多)

可針對到庫設置用戶和許可權

用戶端

MongoVUE   免費不好用 Robomongo  推薦        

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多