MongoDB聚合(aggregate)經常使用操做及示例

簡介

MongoDB 中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。前端

有點相似 SQL 語句中的 count(*)vue

經常使用操做

表達式 描述
$match 用於過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操做。
$project 修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。
$limit 用來限制MongoDB聚合管道返回的文檔數。
$skip 在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
$unwind 將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
$group 將集合中的文檔分組,可用於統計結果。
$sort 將輸入文檔排序後輸出。
$lookup 聯表查詢
$geoNear 輸出接近某一地理位置的有序文檔。
$facet/$bucket 分類搜索(MongoDB 3.4以上支持)

 

示例

$match

//查詢條件 以某個分組查詢 (能夠多個查詢條件累加到match裏面)
db.getCollection('doc_views').aggregate([
    {
        $match: { "orgName" : "前端技術部" }
    }
])
//查詢結果以下
/* 1 */
{
    "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"),
    "__v" : 0,
    "time" : "2020-11-11",
    "docName" : "testPublishAll",
    "orgGroup" : "汽車事業羣",
    "orgName" : "前端技術部",
    "count" : 3
}
...

$project

//刪減字段
db.getCollection('doc_views').aggregate([
    {
        $match: { "orgName" : "前端技術部" }
    },
    {
        $project: {
            docName: true,
            orgName: true
        }
    }
])
//查詢結果以下 只顯示設置爲true的字段
/* 1 */
{
    "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"),
    "docName" : "testPublishAll",
    "orgName" : "前端技術部"
}
...
//定義別名 把orgGroup指定指定成count字段
db.getCollection('doc_views').aggregate([
    {
        $match: { "orgName" : "前端技術部" }
    },
    {
        $project: {
            docName: true,
            orgName: true,
            orgGroup: "$count"
        }
    }
])
//查詢結果orgGroup字段展現count的值
/* 1 */
{
    "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"),
    "docName" : "testPublishAll",
    "orgName" : "前端技術部",
    "orgGroup" : 3
}

$group

//聚合條件 _id :強制必須存在。 
db.getCollection('doc_views').aggregate([
    {
        $group: { 
            _id: { name: "$docName", orgName: "$orgName" },
           total: { $sum: "$count" } 
        }
    }
    
])
//一、_id: null  _id爲null的查詢結果
/* 1 */
{
    "_id" : null,
    "total" : 474
}
//二、_id: "$docName" _id爲某字段
/* 1 */
{
    "_id" : "gch-gitbook",
    "total" : 8
}
...
//三、_id: { name: "$docName", orgName: "$orgName" } _id查詢條件併爲字段定義別名
/* 1 */
{
    "_id" : {
        "name" : "vuepress-hjw-test",
        "orgName" : "前端技術部"
    },
    "total" : 2
}

$sort、$skip、$limit

//列表分頁的時候通常三個聯合使用來作數據分頁
//sort列表排序 skip指定跳過多少條 limit每次查詢條數
//skip的計算方式:(當前頁碼-1)*每頁大小 如:(pageIndex - 1) * pageSize
db.getCollection('doc_views').aggregate([
    {$sort: {_id: -1}},
    {$skip:Number(100)},
    {$limit:Number(10)} 
])
//查詢結果以下
/* 1 */
{
    "_id" : ObjectId("604ecc57b3b65a411b5600de"),
    "__v" : 0,
    "time" : "2021-02-25",
    "docName" : "abgFeedback",
    "docType" : "vuepress",
    "orgGroup" : "汽車事業羣",
    "orgName" : "前端技術部",
    "count" : 1
}

/* 2 */
{
    "_id" : ObjectId("604ecc57b3b65a411b5600dd"),
    "__v" : 0,
    "time" : "2021-02-24",
    "docName" : "testtestdocs",
    "docType" : "docsify",
    "orgGroup" : "汽車事業羣",
    "orgName" : "前端技術部",
    "count" : 1
}

$lookup

//聯表查詢
db.getCollection('doc_views').aggregate([
    {$sort: {_id: -1}},
    {$skip:Number(100)},
    {$limit:Number(10)},
    {$lookup:{
        from: "docs",
        localField: "docName",
        foreignField: "name",
        as: "child"
    }}
])
//查詢結果
/* 1 */
{
    "_id" : ObjectId("604ecc57b3b65a411b5600de"),
    "__v" : 0,
    "time" : "2021-02-25",
    "docName" : "abgFeedback",
    "docType" : "vuepress",
    "orgGroup" : "汽車事業羣",
    "orgName" : "前端技術部",
    "count" : 1,
    "child" : [ 
        {
            "_id" : ObjectId("5f6da851a18a783210da7a16"),
            "docType" : "vuepress",
            "name" : "abgFeedback",
            "description" : "二手車問題反饋收集問題",
            "owner" : "gongchenghui",
            "orgGroup" : "汽車事業羣",
            "orgName" : "前端技術部",
            "newGit" : false,
            "toTop" : ISODate("2020-11-20T02:41:33.742Z"),
            "realName" : "龔成輝",
            "dest" : "abgFeedback",
            "opendFiles" : [],
            "createTime" : ISODate("2020-09-25T08:20:33.373Z")
        }
    ]
}

$facet 分類查詢

//根據條件 分類一次查詢出想要的數據和數據的總數
db.getCollection('doc_views').aggregate([
    {$match: {"orgName" : "前端技術部"}},
    {
        $facet: {
            respData: [
                {$sort: {_id: -1}},
                {$skip:Number(100)},
                {$limit:Number(1)},
            ],
            total: [
                {
                    $count: "total"
                }
            ]
        }
    }
//查詢結果以下
  /* 1 */
{
    "respData" : [ 
        {
            "_id" : ObjectId("604ecc57b3b65a411b5600de"),
            "__v" : 0,
            "time" : "2021-02-25",
            "docName" : "abgFeedback",
            "docType" : "vuepress",
            "orgGroup" : "汽車事業羣",
            "orgName" : "前端技術部",
            "count" : 1
        }
    ],
    "total" : [ 
        {
            "total" : 284
        }
    ]
}

注意:此方法只能在3.4以上版本的數據庫中使用,低版本的話仍是作兩次查詢git

相關文章
相關標籤/搜索