官方文档
聚合查询
管道和步骤
整个聚合运算称为管道、它是由多个步骤组成的
每个管道:
1、接受一系列文档(原始数据)
2、每个步骤对这些文档进行一系列运算
3、结果文档输出给下个步骤
每一步都把处理过的数据再传递给下一步
聚合运算的基本格式
pipeline = [$stage1, $stage2, ... $stageN];
db.<COLLECTION>.aggregate(
pipeline,
{options}
)
补充:
$geoNear:地理位置
$match
$lt < (less than )
$lte <= (less than or equal to )
$gt > (greater than )
$gte >= (greater than or equal to)
$ne != (not equal to)不等于 {'age': {'$ne': 20}}
$in 在范围内 {'age': {'$in': [20, 23]}} 注意用list
$nin (not in) 不在范围内{'age': {'$nin': [20, 23]}} 注意用list。这个方法可以计算某个值既不等于x也不等于y
$regex (正则匹配) db.collection.find({'name': {'$regex': '^M.*'}}) 匹配以M开头的名字
$exists 属性是否存在 {'name': {'$exists': True}} 查找name属性存在
$type 类型判断 {'age': {'$type': 'int'}} age的类型为int
$text 文本查询 {'$text': {'$search': 'Mike'}} text类型的属性中包含Mike字符串
$or 查找多种条件 ({'$or':[{'name':'chen'},{'name':'wang'}]})
$group
按指定的_id表达式对输入文档进行分组,并为每个不同的分组输出一个文档。_id每个输出文档的字段都包含唯一的按值分组。输出文档还可以包含保存某些累加器表达式值的计算字段
{
$group:
{
_id: <expression>,
<field1>: { <accumulator1> : <expression1> },//可选
...
}
}
_id是必需的,null表示为全部。_id对应的值可以进行分组
_id不是文档的_id,这个用于分组,其值对应文档的某一属性
示例:
{
_id: "$price", //按照price分组
avg:{$avg:"$price"}, //求价格平均值(在这写很鸡肋)
count: {$sum:1}, //文档数量
totalPrice:{$sum:"$price"} //计算总价格
}
$accumulator
返回用户定义的累加器函数的结果。
$addToSet
返回每个组的唯一表达式值数组。数组元素的顺序未定义。
$avg
返回数值的平均值。忽略非数字值。
avg:{$avg:"$price"},
$count
返回组中的文档数。
区别于$count流水线阶段。
count: {$sum:1}
$first
从每个组的第一个文档返回一个值。仅当文档已排序时才定义顺序。
与$first数组运算符不同。
$last
从每个组的最后一个文档返回一个值。仅当文档已排序时才定义顺序。
与$last数组运算符不同。
$max
返回每个组的最高表达式值。
$mergeObjects
返回通过组合每个组的输入文档创建的文档。
$min
返回每个组的最低表达式值。
$push
返回每个组中文档的表达式值数组。
$stdDevPop
返回输入值的总体标准差。
$stdDevSamp
返回输入值的样本标准差。
$sum
返回数值的总和。忽略非数字值。
$project
将带有请求字段的文档传递到管道中的下一个阶段。指定的字段可以是输入文档中的现有字段或新计算的字段。
可以使用 “$project” 来控制数据列的显示规则
普通列({成员:1 | true}):表示要显示的内容
“_id” 列({"_id":0 | false}):表示 “_id” 列是否显示
条件过滤列({成员:表达式}):满足表达式之后的数据可以进行显示
_id:1,
item:true,
itemalias:"$item",
itemalias2:{$multiply:["$quantity",2]}
$sort
$lookup(多表关联查询)
1. 主要功能 是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。数组列存放的数据 是 来自 被Join 集合的适配文档,如果没有,集合为空(即 为[ ])
{
$lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}