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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 1 阳光不要太好。 每天七点送完作业从三楼办公室溜回一楼看见日出的我日常胡思乱想。 今天作业送的挺早的吧,会不会碰...
    荼绫绫阅读 379评论 0 0
  • 写在前面的话: 一直想写下这个故事,它真实的就像你现在看到的这个世界一般。前一篇《一个不会爱上任何人的人》写的就是...
    王周五阅读 70,457评论 187 278
  • 一个女孩要怎样才能变成一个女人呢,是失去第一次的时候吗?不,不是的,那只不过是男人的一个色情的玩笑。生命的成长不应...
    小荷鹿角阅读 858评论 7 4
  • 哈哈,转眼又迎来新的一年,心情还蛮开心的。 在中国来说过年可是最大的事儿了,这一天全家老少聚在一起,...
    酸苹果1960阅读 816评论 0 0
  • oracle安装失败: 删除环境变量中的http_proxy
    my9216阅读 203评论 0 1