Mongodb Aggregation group()分组操作

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

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

{ $group: { _id: , : { : }, ... } }

_id

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

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

运算符

示例

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
相当于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"

你可能感兴趣的:(Mongodb Aggregation group()分组操作)