Mongodb Aggregation group()分组操作

Mongo的分组操作有两种方式:aggregate({$group:{}})group()

1.db.collection.aggregate([$group{}])

{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }

_id

为必选字段,为被分组字段,可为空或null

<accumulator>

为可选字段,其中可包含一下运算符:

运算符

示例

1.仅分组,对issue_xjtf表中sp1,sp2进行分组

db.getCollection("issue_xjtf").aggregate({$group:{
_id:{vol:"$sp1",issue:"$sp2"}}})

相当于sql

Select sp1 as vol,sp2 as issue
From issue_xjtf
group by vol,issue

示例1

2.运算符应用 :first,sum,max

db.getCollection("issue_xjtf").aggregate({
    $group:{
        _id:{vol:"$sp1",issue:"$sp2"},
        first_url:{$first:"$url"},  #first为获取第一个,last为获取最后一个
        count:{$sum:1}, #若求某字段和,需将1改成“$”+字段名的形式,avg可用于获取字段平均值
        time:{$max:"$inserttime"} #max获取最大日期,min可获取最小日期
}})
示例2

2.db.collection.group()

db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })
前三个是必备参数,“[]”中是可选参数

key

可以放用来分组的字段,并且会返回其中字段(group by 后面的字段)

reduce

是在分组操作期间对文档进行操作的聚合函数。可以返回总和或计数。该函数有两个参数:当前文档;该组的聚合结果文档。

initial

对结果中文档,字段进行初始化

cond

对数据筛选的条件,相当于where

示例:

1.count:取xbgi表中,article_pubdate值大于2000-01-01的数据,并分组计数

db.getCollection("xbgi").group({ 
  key: {'article_pubdate': 1},    
  cond: { article_pubdate: { $gt:  '2000-01-01' } }, 
  reduce: function(obj,article_pubdate) {article_pubdate.count++},
  initial: { count:0} 
})
相当于sql
  select article_pubdate,count(article_pubdate) 
  from  xbgi 
  where article_pubdate >'2000-01-01' 
  group by  article_pubdate;

2.max:取sjwd表中,ric_publication_coden为9529a8f7-3eef-431a-a0cd-e49d601417df,用article_year分组计数,取其最晚日期。

db.getCollection("sjwd").group(
   {
     key: {article_year:1},
     cond: { ric_publication_coden: '9529a8f7-3eef-431a-a0cd-e49d601417df' },
     reduce: function( curr, result ) {//curr, result为自定义参数
                 result.count ++;
                 if(result.itime<curr.odi_posttime){
                   result.itime=curr.odi_posttime;}
             },
     initial: { count : 0,'itime':'0'}
   }
)
相当于sql
  Select article_year,count(*) as count,max(odi_posttime) as itime
  From  sjwd 
  Where ric_publication_coden= '9529a8f7-3eef-431a-a0cd-e49d601417df'
  Group By  article_year;

3.sum:在表total_journal_issue中以journal_id分组,并获取article_count总数

db.getCollection("total_journal_issue").group({
     key: {journal_id:1},
     reduce: function(curr,result){//curr当前文档, result结果文档
         if(typeof curr.article_count!="undefined"){//判断article_count字段是否存在,其他方式参见js语法
             result.sum_article=curr.article_count+result.sum_article;
      }},
     initial: {sum_article:0}//sum_article字段初始化
})
相当于sql
Select journal_id,sum(article_count) as sum_article
From total_journal_issue
Group By journal_id

注:分组限制

用Navicat 执行group()时,分组值超过20000,会报如下错误(未检测具体原因):

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

推荐阅读更多精彩内容

  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 977评论 0 2
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,451评论 0 13
  • MongoDB使用总结 数据库操作 show dbs : 显示所有的数据库 use user : 选择数据库u...
    爱撒谎的男孩阅读 1,134评论 0 3
  • 知识点:美化输出:db.stu.find().pretty() $project:修改输入文档的结构。可以用来重命...
    胖虎很可爱阅读 724评论 0 1
  • 一、MongoDB简介 概述MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供...
    王梓懿_1fbc阅读 493评论 0 3