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方法,判断元素是否相等
}
}
}
}
])