Ste*_*uso 7 mapreduce mongodb aggregation-framework
我有一个看起来像这样的集合:
{
"_id": "id0",
"name": "...",
"saved_things": [
{ ... },
{ ... },
{ ... },
]
}
{
"_id": "id1",
"name": "...",
"saved_things": [
{ ... },
]
}
{
"_id": "id2",
"name": "...",
"saved_things": [
{ ... },
]
}
Run Code Online (Sandbox Code Playgroud)
等等...
我想使用mongodb的聚合框架,以便得出一个直方图结果,告诉我们有多少用户有一定数量的saved_things.例如,对于上面的数据集,它可以返回如下内容:
{ "_id": 1, "count": 2 },
{ "_id": 3, "count": 1 }
Run Code Online (Sandbox Code Playgroud)
我已经尝试了各种聚合函数的组合,如下所示,但没有一个能够正确解决.(我觉得我正在谈论这个非常错误.)
collection.aggregate([
{ $unwind: "$saved_things" },
{ $group: "$_id", count: { $sum: 1 } } },
{ $group: "$count", number: { $sum: 1 } } },
{ $sort: { number: -1 } }
], function(err, result) {
console.log(result);
});
Run Code Online (Sandbox Code Playgroud)
这可能与Mongo的聚合框架有关,还是我会更好地使用map reduce函数?
小智 6
好的,我知道了!开始了.聚合管道基本上是:
{
$unwind: "$saved_things"
},
{
$group: {
_id: "$_id",
size: {
$sum: 1
}
}
},
{
$group: {
_id: "$size",
frequency: {
$sum: 1
}
}
},
{
$project: {
size: "$_id",
frequency: 1,
_id: 0
}
}
Run Code Online (Sandbox Code Playgroud)
展开saved_things数组,然后按文档分组_id并计算它,这样我们就可以实现数组大小.现在很容易,分组size并计算频率.使用项目将_id字段重命名为size.