mongoDB入门三

聚合(aggregate)

mongoDB中的聚合主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

语法格式

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

注解:

这里的AGGREGATE_OPERATION指的是聚合的操作(mongoDB中提供有三种聚合操作:

  • aggregate pipeline

  • map-reduce function

  • single purpose aggregation methods)。

这里主要讲一下aggregate pipeline

aggregate(【pipes】)中的pipes通常由一个或者多个管道组成。最基本的管道阶段提供过滤器,其操作类似于查询和文档转换,可以修改输出文档的形式。

其他管道操作提供了按特定字段或字段对文档进行分组和排序的工具,以及用于聚合数组内容(包括文档数组)的工具。此外,管道阶段可以使用运算符来执行诸如计算平均值或连接字符串之类的任务。

假设这样一个场景:不同职业的人向商店买东西,然后商店想计算一下不同物品的销售量。

以下代表一个订单情况

{ 
good_id:"A103",
 amount:"500", 
job:"法师"
}

这里我们可以使用这样的语句来得出卖给法师的商品中各商品的销售量:

db.orders.aggregate([ 
{$match:{status:"法师"}}, 
{$group:{_id:"good_id",total:{$sum:"$amount"}}
}
])

聚合管道操作

$match 用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。

db.articles.aggregate( [ { $match : { author : “dave” } } ]);

$sort 将输入文档排序后输出。1为正序,-1为倒序

db.users.aggregate( [ { $sort : { age : -1, posts: 1 } } ])

$limit 限制传递到管道中下一个阶段的文档数。

db.article.aggregate( { $limit : 5 })

$count 返回一个包含输出到下一阶段的数量的文档。例如如下:返回harm结果大于80的harm的数量的文档,并命名为high-harm。

db.scores.aggregate( [ 
{ $match: { score: { $gt: 80 } } }, 
{ $count: "passing_scores" }
 ])

$project 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。 例如如下:我们将文档的输出结构只保留title\author_id字段,注意_id是默认包含的。

db.article.aggregate( { $project : { title : 1 , author : 1 , }} )

$addFields 向文档添加新字段。输出包含输入文档和新添加字段中所有现有字段的文档。注意:如果重名将会覆盖。 例如以下案例。我们将通过sum操作来计算现有字段的值后添加出两个新的值,再通过add操作来将三个字段的值相加。最终我们将会获得包含三个新的字段的文档。

db.scores.aggregate( [ 
{ $addFields: { totalHomework: { ​homework" } , totalQuiz: { ​quiz" } } },
 { $addFields: { totalScore: { ​totalHomework", "​extraCredit" ] } } }
] )

addFields阶段字段操作

$ + abs/add/substract/multiply/divide/mod/sqrt 字面含义,不多做解释。

$group 按一些指定的表达式对文档进行分组,并为每个不同的分组输出到下一个阶段的文档。 例如如下操作:

//以下为sales集合中的一条记录
{
 "_id" : 5, 
"item" : "abc",
 "price" : 10,
 "quantity" : 10, 
"date" : ISODate("2014-04-04T21:23:13.331Z") 
}

//按月,日和年对文档进行分组,并计算总价格和平均数量,并计算每个组的文档

$group : { _id : { month: { ​date" }, day: { ​date" }, year: { ​date" } }, 
totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } }, 
averageQuantity: { ​quantity" }, count: { $sum: 1 } } }
 ])

group阶段字段操作

$ + sum/avg/min/max/last/first/push/addToSet 字面含义,不多做解释。

对文档进行转换输出

$ lookup 对同一 数据库中的未整数集合执行左外连接,以过滤“已连接”集合中的文档以进行处理。

$unwind 从输入文档解构数组字段以输出每个元素的文档。每个输出文档都是输入文档,其中数组字段的值由元素替换。

以上,详情参看https://docs.mongodb.com/manual/reference/operator/aggregation

    原文作者:JervieQin
    原文地址: https://www.jianshu.com/p/f274c33ac9ee
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞