1. 程式人生 > 其它 >對mongodb 欄位中的列表list 進行查詢統計

對mongodb 欄位中的列表list 進行查詢統計

技術標籤:技術類mongodb列表資料庫

對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" //對應上方重構後的資料別名,進行統計
            }
        }
    }
])