时间:2021-07-01 10:21:17 帮助过:33人阅读
用来找出给定键的所有不同值,使用时必须指定集合和键:
group会促使MongoDB将集合依据选定键值的不同分成若干组,然后通过聚合每一组内的文档,产生一个结果文档。讲的有点模糊?看下面的例子:
db.runCommand(
{
"group":
{
"ns":"lf",
"key":{"name":true},
"initial":{"count":0},
"$reduce":function(doc,prev)
{
prev.count++;
},
"condition":{"age":{"$gt":20}}
}
}
)
通过ns指定要分组的集合:
"ns":"lf",
通过key完成文档分组的依据:
"key":{"name":true},
这里说明所有name键的值相同的文档会被划分到一组,true代表会返回键name的值。
initial代表初始化,可以用来设置累加器变量
"initial":{"count":0},
$reduce表示函数调用
"$reduce":function(doc,prev){...}
condition用来存放筛选条件:
"condition":{"age":{"$gt":20}}
最后执行结果为:
下面介绍一下完成器finalize,完成器用于精简从数据库传到用户的数据,也就是说,可以针对查询结果进一步过滤:
db.runCommand(
{
"group":
{
"ns":"lf",
"key":{"name":true},
"initial":{"count":0},
"$reduce":function(doc,prev)
{
prev.count++;
},
"finalize":function(doc)
{
doc.num=doc.count;
delete doc.count;
}
}
}
)
finalize能够修改传递的参数,也能够返回新值,结果如下:
有些时候分组所依据的条件很复杂,不仅是一个键.比如要使用group计算每个类别有多篇博客文章.由于有很多作者,给文章分类时可能不规律的使用了大小写。
所以,如果要是按类别名来分组,最后”MongoDB”和”mongodb”就是不同的组.为了消除这种大小写的影响,就要定义一个函数来确定文档所依据的键。定义分组要用到$keyf:
db.runCommand(
{
"group":
{
"ns":"lf",
"$keyf":function(doc){return {"name":doc.username.toLowerCase()}},
"initial":{"count":0},
"$reduce":function(doc,prev)
{
prev.count++;
}
}
}
)
版权声明:本文为博主原创文章,未经博主允许不得转载。
MongoDB之聚合
标签:mongodb 聚合数据 文档 sql