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
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.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"