查詢選擇器(預設首碼為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 推薦 |
|