聚合操作介绍
db.collection.aggregate( [pipeline],
2个参数,一个管道列表 一个可选参数
管道包括多个阶段
阶段 | 描述 |
---|---|
$addFields |
向文档添加新字段。类似于 expression 部分一般就是 公式 和 字段 ,字段一般用$column 表示。 |
$bucket |
根据指定的表达式和存储区边界,将传入的文档分组,称为存储桶。 |
$bucketAuto |
根据指定的表达式将传入的文档分类为特定数量的组(称为存储桶)。自动确定存储桶边界,以尝试将文档均匀地分配到指定数量的存储桶中。 |
$collStats |
返回有关集合或视图的统计信息。 包括读写时间个数,存储信息统计。 |
$count |
返回聚合管道此阶段的文档数量计数。 $count 后 跟字段名字,一共进来多少个文档 |
$facet |
在同一组输入文档的单个阶段内处理多个聚合管道。支持创建能够在单个阶段中跨多个维度或方面表征数据的多面聚合。 { $facet: } db.artwork.aggregate( [ |
$geoNear |
基于与地理空间点的接近度返回有序的文档流。集成的功能 |
$graphLookup |
对集合执行递归搜索。对于每个输出文档,添加一个新的数组字段,其中包含该文档的递归搜索的遍历结果。 |
$group |
按指定的标识符表达式对文档进行分组,并将累加器表达式(如果已指定)应用于每个组。消耗所有输入文档,并为每个不同的组输出一个文档。输出文档仅包含标识符字段,如果指定,则包含累积字段。 |
$indexStats |
返回有关集合的每个索引的使用的统计信息。 |
$limit |
将未修改的前n个文档传递给管道,其中n是指定的限制。对于每个输入文档,输出一个文档(对于前n个文档)或零文档(在前n个文档之后)。 |
$listSessions |
列出活动时间足以传播到 |
$lookup |
对同一数据库中的另一个集合执行左外连接,以 从“已连接”集合中过滤文档以进行处理。 表连接查询 { $lookup: { from: "otherCollection", as: "resultingArray", localField: "x", foreignField: "y" } } |
$match |
过滤文档流以仅允许匹配的文档未经修改地传递到下一个管道阶段。 $match 使用标准的MongoDB查询。对于每个输入文档,输出一个文档(匹配)或零文档(不匹配)。 |
$out |
将聚合管道的结果文档写入集合。要使用 |
$project |
重新整形流中的每个文档,例如添加新字段或删除现有字段。对于每个输入文档,输出一个文档。 |
$redact |
access level 存取等级 有三种: 与其他完全过滤不同,$redact聚合是对文档内部进行操作,返回的是经过删减的文档,而不是将整个文档都删除掉。该操作符常常和$cond一起使用。 |
$replaceRoot |
用指定的嵌入文档替换文档。该操作将替换输入文档中的所有现有字段,包括 db.people.aggregate( [ |
$sample |
从输入中随机选择指定数量的文档。 db.users.aggregate( |
$skip |
跳过前n个文档,其中n是指定的跳过编号,并将未修改的其余文档传递给管道。对于每个输入文档,输出零文档(对于前n个文档)或一个文档(如果在前n个文档之后)。 db.article.aggregate( |
$sort |
按指定的排序键重新排序文档流。只有订单改变; 文件保持不变。对于每个输入文档,输出一个文档。 db.users.aggregate( |
$sortByCount |
根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档计数。 |
$unwind |
从输入文档解构数组字段以输出每个元素的文档。每个输出文档都使用元素值替换数组。对于每个输入文档,输出n个文档,其中n是数组元素的数量,对于空数组,可以为零。 db.inventory2.aggregate( [ |
$set |
|
$unset |
删除多个字段 |
$ replaceWith |
删除多个字段 |
$unset |
删除多个字段 |
db.aggregate()
阶段
从3.6版开始,MongoDB还提供了以下 db.aggregate
方法:
以下阶段使用db.aggregate()
方法而不是db.collection.aggregate()
方法。
阶段 | 描述 |
---|---|
$currentOp |
返回有关MongoDB部署的活动和/或休眠操作的信息。 |
$listLocalSessions |
列出最近在当前连接mongos 或mongod 实例上使用的所有活动会话。这些会话可能尚未传播到system.sessions 集合中。 |
其他聚合操作符,参考 http://www.mongoing.com/docs/reference/operator/aggregation-pipeline.html
db.getCollection('process').aggregate([
{
$match :{"xx":{$in:["xx1","xx2"]}}
},
{
$sort:{"create_time":-1}
},
{
$skip :14
},
{
$limit:1
},
{
$unwind: {
path: "$processResult.factor_list",
includeArrayIndex: "arrayIndex",
preserveNullAndEmptyArrays: true
}
},
{
$project : {
source_id : 1 ,
create_at: '$create_time',
credit_id: 1,
_id:0,
hello:"asd",
event_code :1 ,
processResult:'$processResult.factor_list'
}
},
{
$sort:{"processResult.name":-1}
},
{
$limit:10
},
{
$match :{"processResult.type":{$eq:"router"}}
},
{
$group:{
_id : "$source_id",
count: {$sum : 1},
max_eventcode:{ "$max":"$event_code"},
min_eventcode:{ "$min":"$event_code"},
avg_eventcode:{ "$avg":"$event_code"},
factor_types_list:{"$push":"$processResult.type"},
factor_types_set:{"$addToSet":"$processResult.type"},
firstcreditid:{"$first":"$credit_id"},
lastcreditid:{"$last":"$credit_id"}
}
},
{
$group:{
_id : {'a': '$a', 'b': '$b', 'D': '$D'},
count: {$sum : 1},
max_eventcode:{ "$max":"$event_code"},
min_eventcode:{ "$min":"$event_code"},
avg_eventcode:{ "$avg":"$event_code"},
factor_types_list:{"$push":"$processResult.type"},
factor_types_set:{"$addToSet":"$processResult.type"},
firstcreditid:{"$first":"$credit_id"},
lastcreditid:{"$last":"$credit_id"}
}
},
{$out: 'hh_col’},
{
$match :{"count":{$gt:5}}
},
]
,{allowDiskUse: true}
)
聚合管道的优化 http://www.mongoing.com/docs/core/aggregation-pipeline-optimization.html
聚合管道的限制 http://www.mongoing.com/docs/core/aggregation-pipeline-limits.html
聚合管道和分片集合 http://www.mongoing.com/docs/core/aggregation-pipeline-sharded-collections.html