使用mongodb聚合框架按数组长度分组

时间:2013-07-30 18:53:10

标签: mongodb mapreduce aggregation-framework

我有一个看起来像这样的集合:

{
    "_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函数?

2 个答案:

答案 0 :(得分:5)

好的,明白了!开始了。聚合管道基本上是:

{
    $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分组并计算频率。使用项目将_id字段重命名为size

答案 1 :(得分:1)

你可以使用 $size 键 示例

query :

[{ 
   $group: {
     _id:{$size:'$saved_things'},
     total: { $sum: 1 },
   }
}]

output:
[{ _id: 4, total: 2 }]