成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Mongodb聚合查詢及在日常運(yùn)維中的使用

IT那活兒 / 3799人閱讀
Mongodb聚合查詢及在日常運(yùn)維中的使用
點(diǎn)擊上方藍(lán)字關(guān)注我們


一、Mongodb聚合查詢介紹


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文檔。


二、聚合查詢?cè)敿?xì)講解


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和運(yùn)算符


常用的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é)果:


五、聚合查詢?cè)谌粘_\(yùn)維中的使用


Mongodb中除少量配置集合外,無相關(guān)的性能視圖。早期版本只有db.currentOp()命令可查看會(huì)話信息,從3.6版開始提供$currentOpstage,可更加靈活的獲取會(huì)話信息。

$currentOpstage只能在admin庫執(zhí)行

{$currentOp: { allUsers: , idleConnections: } }


--顯示當(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);

}

});

}

});


END



文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129983.html

相關(guān)文章

  • 一文梳理 RedHat 和 CentOS 運(yùn)維中網(wǎng)絡(luò)知識(shí)

    摘要:一系統(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ā)揮自己...

    Olivia 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<