快速入门MongoDB聚合查询

1、查询语法

MongoDB聚合运算过程称为管道(PipeLine),由多个步骤(Stage)组成,具体过程可理解为下图:
在这里插入图片描述

  • 管道接受原始文档
  • 每个步骤对文档进行一系列的运算
  • 结果文档输出给下一个步骤
  • 步骤结束,输出最终结果

MongoDB聚合查询语法:

db.<集合>.aggregate([<stage1><stage2>,<stage3>...<stagen>],{options})

db.<collection>.aggregate() 可以用多个构件创建一个管道,对于一连串的文档进行处理。这些构件包括:筛选操作的$match、映射操作的 p r o j e c t 、 分 组 操 作 的 ‘ project、分组操作的` projectgroup、排序操作的 s o r t ‘ 、 限 制 操 作 的 ‘ sort`、限制操作的` sortlimit`、和跳过操作的$skip。

2、常见步骤(Stage)操作符

步骤操作符作用sql等价操作符
$match过滤where
$project投影select
$sort排序ORDER BY
$group分组GROUP BY
$skip跳过进入stage的指定数量的文档SKIP
$limit限制传递到管道中下一阶段的文档数LIMIT
$lookup左外链接LEFT OUTER JOIN

3、常见步骤(Stage)中的运算符

3.1、$match 过滤操作符中常见函数
  • $lt:存在并小于
  • $lte:存在并小于等于
  • $gt:存在并大于
  • $gte:存在并大于等于
  • $ne:不存在或者存在不等于
  • $in:存在并在指定数组中
  • $nin:不存在或不在指定数组中
  • $or:匹配两个或者多个条件中的一个
  • $and:匹配全部条件
  • $not: 查询到不匹配表达式的文档
3.2、$group 过滤操作符中常见函数
  • $multiply 乘法
  • $divide 除法
  • $substract 减法
  • $add 求和
  • $mod 求余数
  • $year 日期中的年份
  • $month 日期中的月份
  • $dayOfMonth 一年中的某一月
  • $hour 日期中的小时
  • $minute 日期中的分中
  • $second 日期中的秒
3.2、$project 过滤操作符中常见函数
  • $sum 计算总和
  • $avg 计算平均值
  • $push 在结果文档中插入值到一个数组中。
  • $addToSet 在结果文档中插入值到一个数组中,但不创建副本。
  • $first 根据资源文档的排序获取第一个文档数据。
  • $last 根据资源文档的排序获取最后一个文档数据
  • $max 获取集合中所有文档对应值得最大值。
  • $min 获取集合中所有文档对应值得最小值

3、查询示例

  • 查询条件范围内的订单数量
db.orders.aggregate({
 {$match:{status:"completed",orderDate:{
		                    $gte:ISODate("2019-01-01"),
                            $lte:ISODate("2019-03-31")}
 },
 {$group:{
       _id:null,//分组字段,为null代表不分组
       orderCount:{$sum:1}  //总的订单数
    }
 },
 {$project:{
     _id:0 //不显示ID,如果不显示指定_id不显示,默认显示ID
  }
 }
})
  • 查询条件范围内的订单总金额

查询2019-02-01至2019-05-1范围内已完成订单的总金额

db.orders.aggregate([
	      
		  //过滤条件
		  {$match:{status:"completed",orderDate:{
		                              $gte:ISODate("2019-02-01"),
                                      $lt:ISODate("2019-05-1")									  
		  
		  }}},  
		  
		  // 分组
		  {$group:{
		            _id:null,
					total:{$sum:"$total"},   //查询订单总金额
					shippingFee:{$sum:"$shippingFee"},  //运费总金额
					count:{$sum:1}    //订单数量
		         }
		   },
           {$project:{
		        grandTotal:{$add:["$total","$shippingFee"]},  //订单总金额+运费总金额
				count:1,   //显示订单数量
				_id:0   //不显示ID
		   
		   }}		   
	    
	 ])
  • 查询条件范围内的最大订单金额
db.orders.aggregate([
	      
		  //过滤条件
		  {$match:{status:"completed",orderDate:{
		                              $gte:ISODate("2019-02-01"),
                                      $lt:ISODate("2019-05-1")									  
		  
		  }}},  
		  
		  // 分组
		  {$group:{
		            _id:null,
					maxMoney:{$max:"$total"} //查询最大金额
		         }
		   },
           {$project:{
		        maxMoney:1,
				_id:0   //不显示ID
		   
		   }}		   
	    
	 ])
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值