使用mongodb聚合框架按数组长度分组
我有一个类似这样的收藏:使用mongodb聚合框架按数组长度分组,mongodb,mapreduce,aggregation-framework,Mongodb,Mapreduce,Aggregation Framework,我有一个类似这样的收藏: { “_id”:“id0”, “姓名”:“…”, “保存的东西”:[ { ... }, { ... }, { ... }, ] } { “_id”:“id1”, “姓名”:“…”, “保存的东西”:[ { ... }, ] } { “_id”:“id2”, “姓名”:“…”, “保存的东西”:[ { ... }, ] } 等等 我想使用mongodb的聚合框架得出一个直方图结果,告诉多少用户有一定数量的已保存的内容。例如,对于上面的数据集,它可以返回如下内容: {u
{
“_id”:“id0”,
“姓名”:“…”,
“保存的东西”:[
{ ... },
{ ... },
{ ... },
]
}
{
“_id”:“id1”,
“姓名”:“…”,
“保存的东西”:[
{ ... },
]
}
{
“_id”:“id2”,
“姓名”:“…”,
“保存的东西”:[
{ ... },
]
}
等等
我想使用mongodb的聚合框架得出一个直方图结果,告诉多少用户有一定数量的已保存的内容。例如,对于上面的数据集,它可以返回如下内容:
{u id:1,“count:2},
{u id:3,“count:1}
我尝试过各种聚合函数的组合,如下面的一个,但没有一个是正确的。(我觉得我在这件事上大错特错。)
collection.aggregate([
{$REWIND:“$saved_things”},
{$group:“$\U id”,计数:{$sum:1}},
{$group:“$count”,编号:{$sum:1}},
{$sort:{number:-1}}
],函数(错误,结果){
控制台日志(结果);
});
Mongo的聚合框架可以实现这一点吗?还是使用map reduce函数更好?好的,明白了!我们开始吧。聚合管道基本上是:
{
$unwind: "$saved_things"
},
{
$group: {
_id: "$_id",
size: {
$sum: 1
}
}
},
{
$group: {
_id: "$size",
frequency: {
$sum: 1
}
}
},
{
$project: {
size: "$_id",
frequency: 1,
_id: 0
}
}
展开保存的东西
数组,然后按文档\u id
分组并计数,这样就可以得到数组大小。现在很简单,按大小分组并计算频率。使用project将\u id
字段重命名为size
您可以使用$size键
范例
有多少用户拥有一定数量的已保存内容子集合是什么意思?给定一个保存的东西
,您想知道哪些用户有保存的东西
,以及有多少?是吗?嗯,我的措辞似乎有点混乱,对不起!我认为示例输出最好地描述了我正在寻找的内容,但我将再次尝试描述它。我想为集合中的每个用户获取saved_things
中的对象数,并聚合该计数的频率。它用于生成用户数量的柱状图(如果有意义的话)。让我知道,如果这仍然是混乱的任何方式。看起来它真的很接近。我得到的结果是:开玩笑!我是在回显结果
,而不是结果
,这导致了问题。我看到的唯一一件不太有效的事情是没有频率0的数据。有什么可以做的吗?我不相信这个聚合将包括一个零长度数组文档的频率值。我挠头了一分钟,想知道为什么我的频率总和与我的特定收藏数量不匹配。
query :
[{
$group: {
_id:{$size:'$saved_things'},
total: { $sum: 1 },
}
}]
output:
[{ _id: 4, total: 2 }]