MongoDB 中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。前端
有點相似 SQL 語句中的 count(*)。vue
表達式 | 描述 |
---|---|
$match | 用於過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操做。 |
$project | 修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。 |
$limit | 用來限制MongoDB聚合管道返回的文檔數。 |
$skip | 在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。 |
$unwind | 將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。 |
$group | 將集合中的文檔分組,可用於統計結果。 |
$sort | 將輸入文檔排序後輸出。 |
$lookup | 聯表查詢 |
$geoNear | 輸出接近某一地理位置的有序文檔。 |
$facet/$bucket | 分類搜索(MongoDB 3.4以上支持) |
//查詢條件 以某個分組查詢 (能夠多個查詢條件累加到match裏面) db.getCollection('doc_views').aggregate([ { $match: { "orgName" : "前端技術部" } } ]) //查詢結果以下 /* 1 */ { "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"), "__v" : 0, "time" : "2020-11-11", "docName" : "testPublishAll", "orgGroup" : "汽車事業羣", "orgName" : "前端技術部", "count" : 3 } ...
//刪減字段 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 }
//聚合條件 _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每次查詢條數 //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 }
//聯表查詢 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") } ] }
//根據條件 分類一次查詢出想要的數據和數據的總數 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