当前位置: 首页 > news >正文

mongodb聚合的使用

聚合:
主要用于计算和统计等,类似sql种的sum() avg()
db.集合.aggregate( { 管道:{表达式} } )

常用的管道:
$group:将集合中的文档按照字段进行分组
$match:过滤数据,输出符合条件的文档
$project:修改文档的结构,重命名、增加、删除字段,创建结果,类似投影,指定字段显示结果
$sort:排序
$limit:限制返回文档条数
$skip:跳过指定数量的文档
$unwind:对列表类型字段内容拆分

常用表达式: $表达式:"$字段"
$sum:计算总数量,$sum:1 代表按照1倍进行统计总数量
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:结果文档插入到一个数组给配合分组使用
$first:获取排序后第一个文档数据
$last:获取排序后最后一个文档数据




$group: {_id:"$字段"} 指定字段分组,id为null代表全部数据为一组
例如:统计男生、女生的人数
db.stu.aggregate(
{$group:{
_id:"$gender", //按照gender进行排序
total:{$sum:1} //自己设置一个字段total用于保存统计每个组的人数
// $sum:1 代表按照一倍进行统计总数量
}}
)

_id:null 代表所有数据分为一组
例如: 求总人数和平均年龄
db.stu.aggregate(
{$group:{
_id:null, //整个数据分为一组
total:{$sum:1}, //按照一倍统计总数量
avg_age:{$avg:"$age"} //按照字段年龄求平均数
}}
)



$push: 透视数据,将符合分组条件的字段插入到结果列表当中,"$$ROOT"可以令整个文档插入列表
例如:按照性别统计姓名:
db.stu.aggregate(
{$group:{
_id:"$gender", //按照性别进行分组
names:{$push:"$name"} //将符合分组的name字段值插入 names的列表里
}}
)


例如: 按照性别,统计文档
db.stu.aggregate(
{$group:{
_id:"$gender", //按照性别进行分组
info:{$push:"$$ROOT"} //将符合分组的文档插入到info列表当中
}}
)

$match: 过滤数据,输出符合条件的文档
例如:查询年龄大于20的学生
db.stu.aggregate(
{$match:{age:{$gt:20}}} //年龄大于20
)

例如:查询年龄大于20的男生女生分别的人数。(多个管道进行并列)
db.stu.aggregate(
{$match:{age:{$gt:20}}}, //年龄大于20 筛选出符合条件的数据
{$group:{
_id:"$gender", //按照性别分组
total:{$sum:1} //求出总数量
}}
)

$project: 类似投影,指定字段进行显示结果
例如: 查询学生的姓名、年龄
db.stu.aggregate(
{$project:{
_id:0,
name:1, //指定为1代表显示,指定为0代表不显示
age:1
}}
)

例如:查询男女生,输出人数
db.stu.aggregate(
{$group:{ //按照性别分组后统计人数
_id:"$gender",
total:{$sum:1}
}},
{$project:{
_id:0, //指定只输出总数 不输出_id
total:1
}}
)

$sort: 排序后输出,1为升序 -1为降序
例如: 查询学生信息,按年龄升序
db.stu.aggregate(
{$sort:{age:1}}
)

例如: 查询男女生的人数并按人数降序
db.stu.aggregate(
{$group:{ //按年龄排序求出总人数
_id:"$gender",
total:{$sum:1}
}},
{$sort:{total:-1}} //按照total的降序排列
)

$skip和$limit:
$skip:num 越过前num条文档
$limit:num 显示num条文档
先skip再limit实现分页的功能

例如:查询3到7条(略过前2条,查询5条)
db.stu.aggregate(
{$skip:2},
{$limit:5}
)

$unwind:对文档中包含列表类型按照列表内元素个数数据进行拆分成多条
构造数据:db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
拆分: db.t2.aggregate( {$unwind:"$size"} )
结果: { "_id" : 1, "item" : "t-shirt", "size" : "S" }
{ "_id" : 1, "item" : "t-shirt", "size" : "M" }
{ "_id" : 1, "item" : "t-shirt", "size" : "L" }

处理空数组、非数组、无字段、null情况:(按如上操作会丢失查询结果)
需要指定preserveNullAndEmptyArrays: true代表保留空文档,false代表不保留空文档
构造数据:db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
丢数据的拆分: db.t3.aggregate({ $unwind:"$size" })
空的size仍然保留信息: db.t3.aggregate({ $unwind:"$size",preserveNullAndEmptyArrays:true })

转载于:https://www.cnblogs.com/Lin-Yi/p/7384977.html

相关文章:

  • 单例模式Singleton
  • 随机打乱数组
  • 敏捷软件开发模型Scrum通俗讲义
  • kafka基本原理概述——patition与replication分配
  • Eclipse快捷键大全
  • IDA*算法——骑士精神
  • cygwin的安装若干问题
  • bfs
  • Anaconda使用(转载)
  • stl vector源码剖析
  • 【Android Dev Guide - 04】 - Media - 学习使用MediaPlayer播放音乐
  • android开发学习之路——连连看之游戏界面(一)
  • 安装GoldenGate错误OGG-01756
  • 源码阅读经验谈-slim,darknet,labelimg,caffe(1)
  • 【AMQ】之JMS概念
  • 345-反转字符串中的元音字母
  • EOS是什么
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTTP中GET与POST的区别 99%的错误认识
  • Java精华积累:初学者都应该搞懂的问题
  • Magento 1.x 中文订单打印乱码
  • mysql常用命令汇总
  • PaddlePaddle-GitHub的正确打开姿势
  • Redis 懒删除(lazy free)简史
  • spring + angular 实现导出excel
  • spring boot 整合mybatis 无法输出sql的问题
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • WebSocket使用
  • 安卓应用性能调试和优化经验分享
  • 大整数乘法-表格法
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 简单基于spring的redis配置(单机和集群模式)
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 延迟脚本的方式
  • k8s使用glusterfs实现动态持久化存储
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Linux·i2c驱动架构​
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • $.ajax()
  • (4) PIVOT 和 UPIVOT 的使用
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (四)汇编语言——简单程序
  • (转) Face-Resources
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .cn根服务器被攻击之后
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET下ASPX编程的几个小问题
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • ?
  • @EnableAsync和@Async开始异步任务支持