MongoDB聚合(aggregate)常用操作及示例
首页 专栏 前端 文章详情
3

MongoDB聚合(aggregate)常用操作及示例

浅夏晴空 发布于 4 月 19 日
English

简介

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

有点类似 SQL 语句中的 count(*)

常用操作

表达式 描述 $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" } } } ]) //1、_id: null _id为null的查询结果 /* 1 */ { "_id" : null, "total" : 474 } //2、_id: "$docName" _id为某字段 /* 1 */ { "_id" : "gch-gitbook", "total" : 8 } ... //3、_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以上版本的数据库中使用,低版本的话还是做两次查询

mongodb 数据库 前端 后端
阅读 277 更新于 4 月 19 日
举报
赞3 收藏3
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
大前端技术栈
大前端技术汇总
关注专栏
avatar
浅夏晴空
前端开发工程师

基于大前端端技术的一些探索反思总结及讨论

4.5k 声望
3.5k 粉丝
关注作者
0 条评论
得票数 最新
提交评论
avatar
浅夏晴空
前端开发工程师

基于大前端端技术的一些探索反思总结及讨论

4.5k 声望
3.5k 粉丝
关注作者
宣传栏
目录

简介

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

有点类似 SQL 语句中的 count(*)

常用操作

表达式 描述 $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" } } } ]) //1、_id: null _id为null的查询结果 /* 1 */ { "_id" : null, "total" : 474 } //2、_id: "$docName" _id为某字段 /* 1 */ { "_id" : "gch-gitbook", "total" : 8 } ... //3、_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以上版本的数据库中使用,低版本的话还是做两次查询