Mongodb是一種基于JSON文檔的NOSQL數(shù)據(jù)庫,其數(shù)據(jù)查詢語言我們稱之為MQL,如:
db.collectionA.find();--相當(dāng)于select* from connectionA;
db.inventory.find({ status: “A” }, { item: 1, status: 1 } ) --相當(dāng)于SELECT_id, item, status from inventory WHERE status = "A“
Find命令只適合用于單表查詢(包括嵌套文檔和數(shù)組查詢)
Mongo中的復(fù)雜查詢、多集合連接查詢以及數(shù)據(jù)分析和計(jì)算,均需要使用到聚合查詢。,格式如下:
db.collection.aggregate([{stage},{stage},……,{stage}]);
其中stage是聚合的一個(gè)步驟,每個(gè)stage都是一個(gè)json文檔。
Mongodb的聚合架構(gòu)是基于管道,按照stage順序執(zhí)行,類似于shell命令的管道,如:
ps–ef|grep LOCAL=NO|awk ‘{print $2}’|xargs kill -9 ,其處理過程為:
聚合查詢處理過程如下:
其處理過程為:
轉(zhuǎn)換成SQL相當(dāng)于:
Selectcust_id,sum(amount) from orders where status=‘a(chǎn)’ group bycust_id;
常用的stage:
stage | 用途 | SQL等價(jià)運(yùn)算符 | 備注 |
$match | 過濾 | WHERE、having | |
$project | 投影 | SELECT | |
$group | 分組 | group by | |
$lookup | 連接查詢 | LEFT OUT JOIN | 在mongodb中建議使用嵌套文檔,減少連接查詢 |
$unwind | 拆解數(shù)組為文檔 | ||
$sort | 排序 | ORDER BY |
常用的運(yùn)算符:
運(yùn)算符 | 用法 |
$eq/$gt/$gte/$lt/$lte | "=/>/>=/<=/<" |
$and/$or/$not/$in | and or not in |
$split | 按照分隔符將字符串拆成數(shù)組 |
$sum | sum() |
$avg/$min/$max | avg(),max(),min() |
$push | 將文檔構(gòu)成數(shù)組 |
例1:
源數(shù)據(jù):
按照item進(jìn)行分組統(tǒng)計(jì)quantity的和。
Selectitem,sum(quantity) from c1 group by item;對(duì)應(yīng)聚合查詢?nèi)缦拢?/span>
db.c1.aggregate( [ {$group: {_id:"$item", sum_quantity:{$sum:"$quantity"} } } ] ); |
結(jié)果:
按照item進(jìn)行分組統(tǒng)計(jì)quantity的和,且結(jié)果大于10
Selectitem,sum(quantity) from c1 group by item having sum(quantity)>10;對(duì)應(yīng)聚合查詢?nèi)缦拢?/span>
db.c1.aggregate( [ {$group: {_id:"$item", sum_quantity:{$sum:"$quantity"}} }, {$match:{sum_quantity:{$gt:10}} } ] ) |
結(jié)果:
例2:
源數(shù)據(jù):
聚合查詢?nèi)缦拢?/span>
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(); |
結(jié)果:
Mongodb中除少量配置集合外,無相關(guān)的性能視圖。早期版本只有db.currentOp()命令可查看會(huì)話信息,從3.6版開始提供$currentOpstage,可更加靈活的獲取會(huì)話信息。
$currentOpstage只能在admin庫執(zhí)行
{$currentOp: { allUsers:
--顯示當(dāng)前的會(huì)話中,以客戶端IP地址分組統(tǒng)計(jì)連接數(shù)
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}}} ]); |
--查看當(dāng)前活動(dòng)會(huì)話正在執(zhí)行的操作
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(); |
---檢查是否有會(huì)話在等待鎖
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"}]}} ]) |
如果發(fā)現(xiàn)有會(huì)話持有表級(jí)、庫級(jí)或者全局鎖,則可根據(jù)其opid,執(zhí)行db.killOp(opid)釋放鎖資源。如果未發(fā)現(xiàn)表級(jí)以上的鎖,則檢查不處于等待狀態(tài)的會(huì)話在做些什么操作,再進(jìn)行具體處理
$collStats返回表的統(tǒng)計(jì)信息,其信息比db.collection.status()詳細(xì),提供訪問的ops時(shí)長信息。
$indexStatus 返回索引統(tǒng)計(jì)信息,可返回索引的訪問次數(shù),可用在數(shù)據(jù)治理中。
--結(jié)合js腳本,輸出某個(gè)庫中從未使用過的索引(輸出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); } }); } }); |
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129983.html
摘要:一系統(tǒng)運(yùn)維中網(wǎng)絡(luò)方面的規(guī)劃與思考在很多公司,崗位職責(zé)都是很明確的,專職轉(zhuǎn)崗,每人或者每組負(fù)責(zé)一塊業(yè)務(wù)。二系統(tǒng)運(yùn)維中網(wǎng)絡(luò)方面操作梳理在系統(tǒng)運(yùn)維中,經(jīng)常涉及的網(wǎng)絡(luò)方面的操作,一般由以下幾個(gè)方面組成。初步意見,交換機(jī)上線這臺(tái)機(jī)器所連端口。運(yùn)維是一門藝術(shù),也是一門苦差事,每個(gè)人對(duì)此均有不同的理解,正所謂一千個(gè)人眼中有一千個(gè)哈姆雷特。干一行就要愛一行,既然選擇了這個(gè)行業(yè),較好是能把它做到較好,發(fā)揮自己...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20