對mongodb 欄位中的列表list 進行查詢統計
阿新 • • 發佈:2021-01-12
對mongodb 欄位中的列表進行查詢統計,在日常過程中,需要對mongdb 的欄位中為列表的資料進行查詢 。mongodb 欄位型別為list 中的包含的資料進行統計。
{ "_id" : "bd2984a2246af9245c22db1fe7511d80", "CorrectwordAll" : [ { "word" : "下功夫(工)", "counts" : 44 }, { "word" : "奮鬥終身(生)", "counts" : 7 }, { "word" : "座落(坐)", "counts" : 6 }, { "word" : "雪中送碳(炭)", "counts" : 1 }, { "word" : "心心相應(印)", "counts" : 1 }, { "word" : "永保青春(葆)", "counts" : 1 }, { "word" : "山青水秀(清)", "counts" : 1 } ], "SencewordAll" : [ { "word" : "隆重召開", "counts" : 54 }, { "word" : "下功夫", "counts" : 44 }, { "word" : "親自", "counts" : 32 }, { "word" : "軍民融合", "counts" : 15 }, { "word" : "村官", "counts" : 9 }, { "word" : "致詞", "counts" : 8 }, { "word" : "簽定", "counts" : 7 }, { "word" : "受權", "counts" : 5 } ], "allowed_domains" : [ "xxx.edu.cn" ], "crawled" : "on", "create_ts" : ISODate("2021-01-09T20:41:53.321Z"), "disallowd_domains" : [], "domains" : "xxx.edu.cn", "start_urls" : "http://www.xxx.edu.cn/", "update_ts" : ISODate("2021-01-11T11:56:22.083Z"), "webname" : "大學", "status_code" : [ { "status_code" : "-1", "counts" : 161, "status_text" : "附件下載" }, { "status_code" : "-99", "counts" : 67, "status_text" : "無效連結" }, { "status_code" : "200", "counts" : 5106, "status_text" : "正常" }, { "status_code" : "404", "counts" : 188, "status_text" : "死鏈" } ], "tasks" : [ { "status" : "False", "counts" : 13868, "status_text" : "False" }, { "status" : "True", "counts" : 5522, "status_text" : "True" } ] }
這個是文件的內容
現在需要對文件中的tasks的狀態進行分類彙總。類似於的sql 語句
select sum(tasks.counts) as result ,tasks.status as type from document group by tasks.status
其實是一個很簡單基本的彙總統計。但是由於tasks.status 是列表中的值,暫時無法在mongodb 直接統計。
所以需要對結果重新進行重構。也就是型別sql中的子查詢的方式。生成臨時中間表的形式進行二次的查詢 。
首先:採用 unwind 進行list 列表的解析。
第二步:進行相應的過濾,用match可以減少資料量,提高查詢效能
第三步:是重構表格。
第四步:進行資料的統計,彙總等
最終的查詢指令碼如下:
db.website.aggregate([ { //解析list $unwind: "$tasks" }, { //去掉無效資料 進行資料過濾 $match: { "$and": [{ "tasks.status": { $ne: [] } }, { "tasks.status": { $ne: 0 } }] } }, { //重構表格 $project: { _id: 0, type: "$tasks.status", // 將tasks.status 轉換成 別名 type 類似SQL中的AS別名 result: { // 將tasks.counts 轉換成 別名 result $cond: { //判斷配型 陣列取長度 數字取值 if : { $eq: [{ "$type": "$tasks.counts" }, "array"] }, then: { "$size": "$tasks.counts" }, else : "$tasks.counts" } } } }, { //按照type統計求合 $group: { _id: "$type", count: { $sum: "$result" //對應上方重構後的資料別名,進行統計 } } } ])