我有一个看起来像这样的集合:
{
"_id": "id0",
"name": "...",
"saved_things": [
{ ... },
{ ... },
{ ... },
]
}
{
"_id": "id1",
"name": "...",
"saved_things": [
{ ... },
]
}
{
"_id": "id2",
"name": "...",
"saved_things": [
{ ... },
]
}
等等。。。
我想使用mongodb的聚合框架,以便得出一个直方图结果,告诉有多少用户拥有某个saved_things
计数。例如,对于上面的数据集,它可能会返回以下内容:
{ "_id": 1, "count": 2 },
{ "_id": 3, "count": 1 }
我尝试过各种聚合函数的组合,比如下面的一个,但都没有成功。(我觉得我做这件事大错特错。)
collection.aggregate([
{ $unwind: "$saved_things" },
{ $group: "$_id", count: { $sum: 1 } } },
{ $group: "$count", number: { $sum: 1 } } },
{ $sort: { number: -1 } }
], function(err, result) {
console.log(result);
});
这在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
}
}
展开saved_things
数组,然后按文档_id
分组并计数,这样就可以实现数组大小。现在很容易,按size
分组并计数频率。使用project将_id
字段重命名为size
。
您可以使用$size键示例
query :
[{
$group: {
_id:{$size:'$saved_things'},
total: { $sum: 1 },
}
}]
output:
[{ _id: 4, total: 2 }]