Mongodb是一種基于JSON文檔的NOSQL數據庫,其數據查詢語言我們稱之為MQL,如:
db.collectionA.find();--相當于select* from connectionA;
db.inventory.find({ status: “A” }, { item: 1, status: 1 } ) --相當于SELECT_id, item, status from inventory WHERE status = "A“
Find命令只適合用于單表查詢(包括嵌套文檔和數組查詢)
Mongo中的復雜查詢、多集合連接查詢以及數據分析和計算,均需要使用到聚合查詢。,格式如下:
db.collection.aggregate([{stage},{stage},……,{stage}]);
其中stage是聚合的一個步驟,每個stage都是一個json文檔。
Mongodb的聚合架構是基于管道,按照stage順序執行,類似于shell命令的管道,如:
ps–ef|grep LOCAL=NO|awk ‘{print $2}’|xargs kill -9 ,其處理過程為:
聚合查詢處理過程如下:
其處理過程為:
轉換成SQL相當于:
Selectcust_id,sum(amount) from orders where status=‘a’ group bycust_id;
常用的stage:
stage | 用途 | SQL等價運算符 | 備注 |
$match | 過濾 | WHERE、having | |
$project | 投影 | SELECT | |
$group | 分組 | group by | |
$lookup | 連接查詢 | LEFT OUT JOIN | 在mongodb中建議使用嵌套文檔,減少連接查詢 |
$unwind | 拆解數組為文檔 | ||
$sort | 排序 | ORDER BY |
常用的運算符:
運算符 | 用法 |
$eq/$gt/$gte/$lt/$lte | "=/>/>=/<=/<" |
$and/$or/$not/$in | and or not in |
$split | 按照分隔符將字符串拆成數組 |
$sum | sum() |
$avg/$min/$max | avg(),max(),min() |
$push | 將文檔構成數組 |
例1:
源數據:
按照item進行分組統計quantity的和。
Selectitem,sum(quantity) from c1 group by item;對應聚合查詢如下:
db.c1.aggregate( [ {$group: {_id:"$item", sum_quantity:{$sum:"$quantity"} } } ] ); |
結果:
按照item進行分組統計quantity的和,且結果大于10
Selectitem,sum(quantity) from c1 group by item having sum(quantity)>10;對應聚合查詢如下:
db.c1.aggregate( [ {$group: {_id:"$item", sum_quantity:{$sum:"$quantity"}} }, {$match:{sum_quantity:{$gt:10}} } ] ) |
結果:
例2:
源數據:
聚合查詢如下:
db.student.aggregate([{ $lookup: { from: "class", localField: "class_id", foreignField: "id", as: "class_info" } }, {$unwind:"$class_info"}, {$project:{"class_info._id":0,"class_info.id":0}}, {$match:{age:{$gte:16}}}, {$sort:{age:1}} ]).pretty(); |
結果:
Mongodb中除少量配置集合外,無相關的性能視圖。早期版本只有db.currentOp()命令可查看會話信息,從3.6版開始提供$currentOpstage,可更加靈活的獲取會話信息。
$currentOpstage只能在admin庫執行
{$currentOp: { allUsers:
--顯示當前的會話中,以客戶端IP地址分組統計連接數
useadmin db.aggregate([ {$currentOp: { allUsers: true ,idleConnections:true} }, {$project:{IP:{$split:["$client",":"]}}}, {$project:{IP:{$split:["$client",":"]}}}, {$unwind:"$IP"}, {$match:{"IP":/^10./}}, {$group:{_id:"$IP",count:{$sum:1}}} ]); |
--查看當前活動會話正在執行的操作
useadmin db.aggregate([ {$currentOp: { allUsers: true ,idleConnections:false} }, {$project:{opid:1,client:1,op:1,ns:1,microsecs_running:1,command:1}}, {$match:{client:{$exists:true}}}, {$sort:{microsecs_running:-1}} ]).pretty(); |
---檢查是否有會話在等待鎖
db.aggregate([ {$currentOp: { allUsers: true ,idleConnections:false} }, {$project:{opid:1,client:1,op:1,ns:1,microsecs_running:1,waitingForLock:1}}, {$match:{"waitingForLock":true}}, {$count:"waitfor locks"} ]); |
如果存在大量鎖等待,則首先檢查是否存在表、庫、全局鎖
db.aggregate([ {$currentOp: { allUsers: true ,idleConnections:false} }, {$match:{$or:[{"locks.Global":"W"},{"locks.Database":"W"},{"locks.Collection":"W"}]}} ]) |
如果發現有會話持有表級、庫級或者全局鎖,則可根據其opid,執行db.killOp(opid)釋放鎖資源。如果未發現表級以上的鎖,則檢查不處于等待狀態的會話在做些什么操作,再進行具體處理
$collStats返回表的統計信息,其信息比db.collection.status()詳細,提供訪問的ops時長信息。
$indexStatus 返回索引統計信息,可返回索引的訪問次數,可用在數據治理中。
--結合js腳本,輸出某個庫中從未使用過的索引(輸出json)
db.getCollectionNames().forEach(function(collection){ if(db[collection].getIndexes().length != 1) { print("Indexesfor " + collection + ":"); db[collection].aggregate([{ $indexStats:{} },{ $project:{ host:0 } }]).forEach( function(opDoc){ if(opDoc.accesses.ops == 0 && opDoc.name != "_id_") { printjson(opDoc); } }); } }); |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129983.html
摘要:一系統運維中網絡方面的規劃與思考在很多公司,崗位職責都是很明確的,專職轉崗,每人或者每組負責一塊業務。二系統運維中網絡方面操作梳理在系統運維中,經常涉及的網絡方面的操作,一般由以下幾個方面組成。初步意見,交換機上線這臺機器所連端口。運維是一門藝術,也是一門苦差事,每個人對此均有不同的理解,正所謂一千個人眼中有一千個哈姆雷特。干一行就要愛一行,既然選擇了這個行業,較好是能把它做到較好,發揮自己...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20