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 从数组中筛选出符合条件的元素 看下文
注意事项:

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

2、$sort方法中,1表示降序,-1表示升序,这和sort方法的排序相反(我也不知道为什么,有错请指出)

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

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


下一篇:python – 分组和组合字符串