国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Mongodb聚合查詢及在日常運維中的使用

IT那活兒 / 3776人閱讀
Mongodb聚合查詢及在日常運維中的使用
點擊上方藍字關注我們


一、Mongodb聚合查詢介紹


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:

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: , idleConnections: } }


--顯示當前的會話中,以客戶端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);

}

});

}

});


END



文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129983.html

相關文章

  • 一文梳理 RedHat 和 CentOS 維中網絡知識

    摘要:一系統運維中網絡方面的規劃與思考在很多公司,崗位職責都是很明確的,專職轉崗,每人或者每組負責一塊業務。二系統運維中網絡方面操作梳理在系統運維中,經常涉及的網絡方面的操作,一般由以下幾個方面組成。初步意見,交換機上線這臺機器所連端口。運維是一門藝術,也是一門苦差事,每個人對此均有不同的理解,正所謂一千個人眼中有一千個哈姆雷特。干一行就要愛一行,既然選擇了這個行業,較好是能把它做到較好,發揮自己...

    Olivia 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<