mongo aggregate的使用,以及常用api的记录

mongo的聚合查询引用了管道的概念,什么是管道呢,先看一下菜鸟教程上的描述

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

其实就是将每一次表达式处理后的结果缓存起来,作为下一个表达式的文档结构,直到最后一个表达式处理后输出。可见它是单向的、有序的

具体的使用方法可以看菜鸟教程(懒死)

这里记录曾经使用过的部分API(防痴呆):(注:黄色标记的表示不属于管道方法)
api介绍实例
$addFields添加一个新字段[ { $addFields: {newField: 'hello mongo'} } ]|
$project过滤字段[ { $project: {field1: 1, field2: 0} } ]|
$subtract两数相减,可用于判断大小[{ $addFields: { result: { $subtract: ['$totalNumber', '$subNumber'] } } } ]|
$filter从数组中筛选出符合条件的元素看下文
$lookup跨表查询看下文
注意事项:

1、$可以表示管道的方法名,也可以表示管道中的字段

2、$filter不是一个管道命令,无法单独使用,它可以配合$project方法使用,如下代码:

// 这个表达式的意思是,从arr字段(数组)筛选出值等于1的元素,塞入newArr方法中
db.collection.aggregate([
	{
		$project: {	// 管道方法
			newArr: {	// 新字段名称,也可以和原来的字段arr同名
				$filter: {	// mongo方法,用户筛选出数组符合条件的元素
					input: '$arr',  // 需要过滤的数组字段
					as: 'item', 	// 元素的变量名
					cond: {$eq: ['$$item': 1]  // $$item是元素的变量名,$eq是mongo方法,判断元素是否相等
				}
			}
		}
	}
])

3、$addToSet$push的区别在于$addToSet$push多了一个去重的功能,但在聚合分组($group)查询里面,$push会按照上个查询的结果顺序依次插入数组,而$addToSet则会将顺序打乱(目前没有找到到排序规律),具体原因不明,猜测是和$addToSet的去重有关。

4、$lookup的具体使用看下列代码:

// 这个表达式的意思是查询collection2集合里id和collection1的id相等的文档,并将文档添加到docs2字段里
db.collection1.aggregate([
	{
		$lookup: {	// 管道方法
			from: 'collection2',	// 联合查询的集合
			localField: 'id',	// 当前集合匹配的字段,
			foreignField: 'id', // 目标集合(即collection2)匹配的字段
			as: 'docs2' // 将跨表查询的文档插入到此处,此字段是数组类型
		}
	}
])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值