简介

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

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

常用操作

表达式 描述
$match 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$project 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$limit 用来限制MongoDB聚合管道返回的文档数。
$skip 在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group 将集合中的文档分组,可用于统计结果。
$sort 将输入文档排序后输出。
$lookup 联表查询
$geoNear 输出接近某一地理位置的有序文档。
facet/facet/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、sort、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聚合(aggregate)常用操作及示例相关推荐

  1. MongoDB聚合aggregate操作集锦

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...

  2. golang mongodb 聚合(Aggregate) github.com/qiniu/qmgo框架

    项目场景: 最近使用golang 来访问mongodb 出了点问题 github.com/qiniu/qmgo对于数据聚合踩了坑 官方的demo给的太少没有多分支的场景 问题描述: 网上对于golan ...

  3. MongoDB 聚合 aggregate 的 match 和 project 阶段样例

    研究一个 MongoDB 的 aggregate 的 match 和 project 的样例. 博客 博客地址:IT老兵驿站. 正文 前面的帖子有讲过,MongoDB 的 aggregate 是可以分 ...

  4. Openlayers 图层的常用操作

    Openlayers 图层的常用操作 OpenLayers 教程 Openlayers 图层的常用操作 在线示例 OpenLayers 教程 在 Openlayers 中,图层是非常基础的对象,这里汇 ...

  5. MongoDB 添加、查询(条件查询、排序、分页、返回指定字段)、修改、删除数据、聚合aggregate

    MongoDB内部支持JavaScript语法,使用SpiderMonkey作为内部的JavaScript解释器引擎. 1.常用命令 show databases:显示数据库列表 use:切换数据库 ...

  6. Scrapy框架之MongoDB聚合操作

    目录 MongoDB聚合操作 聚合操作的基本语法 常用的聚合操作 管道命令之$group 按照某个字段进行分组 详解 计算集合中某个字段的平均值 常用表达式 管道命令之$match 示例 管道命令之$ ...

  7. MongoDB使用小结:一些常用操作分享

    MongoDB使用小结:一些常用操作分享 本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell.pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程 ...

  8. MongoDB 聚合操作

    MongoDB 聚合操作 在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多 ...

  9. MongoDB——聚合管道之$match和$count操作

    目录 一.聚合管道之$match的概述 二.聚合管道之$count的概述 三.数据准备 四.聚合管道之$match操作示例 五.聚合管道之$count的示例 一.聚合管道之$match的概述 $ ma ...

最新文章

  1. python爬虫系列(5.3-动态网站的爬取的策略)
  2. gns3 查看网关_gns3常用命令
  3. .NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能
  4. 运行Android应用时提示ADB是否存在于指定路径问题
  5. 实现两个数的交换(异或,加减)
  6. Linux统治超级计算领域的九个理由
  7. 《论文笔记》Collaborative Monocular SLAM with Multiple Micro Aerial Vehicles
  8. Java8新特性总结 -8.Nashorn , JavaScript引擎
  9. java biz包 怎么写,关于java dao与biz分工探讨
  10. 通过DataX从Oracle同步数据到MySQL-安装配置过程
  11. springboot中配置过滤器以及可能出现的问题
  12. Callable接口与runable和Thread类
  13. jq控制div是否展示_jQuery判断一个元素是否可见的方法
  14. NETAPP存储常用巡检命令
  15. android图片浮动层,android浮层图片拖动并且可点击效果
  16. Linux-网络管理
  17. CSS3D导航栏翻转效果
  18. 基于百度、高德路线规划的出行圈获取
  19. Android 主题资源风格定制 1
  20. Auto-Tuning with Reinforcement Learning for Permissioned Blockchain Systems

热门文章

  1. 大数据从入门到就业的四个必备常识
  2. UVa 1592 数据库
  3. 以虚拟现实骨灰级开发者视角,来看VR智能硬件平台
  4. java Web程序使用wro4j合并、压缩js、css等静态资源
  5. Android:Touch和Click的区别
  6. Session自定义存储及分布式存储
  7. 话里话外:80后,那人生初始最关键的一步
  8. linux 软件_RansomExx勒索软件现在也针对Linux系统
  9. mysql python 2.7.14_Python2.7.14新手学习
  10. chrome使用脚本修改组策略_允许Chrome安装第三方网站的脚本以及扩展的方法