2013-07-30 180 views
6

的长度使用MongoDB的聚合框架来组我有一个集合,它看起来是这样的:通过阵列

{ 
    "_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); 
}); 

这可能与蒙戈的总框架,或者我会与地图更好减少功能?

+0

你的意思是_how许多用户有一定数量的saved_things subcollectin_?鉴于'saved_thing',你想知道哪些用户有'saved_things'和多少?就是它? –

+0

嗯,我的措辞似乎是混乱,对此感到遗憾!我认为示例输出最能说明我在找什么,但我会试着再次描述它。 我想为collection中的每个用户获取'saved_things'中的对象数,并聚合该计数的频率。它用于生成用户数量“saved_things”的直方图(如果有意义的话)。 让我知道如果这仍然以任何方式混淆。 –

回答

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

+0

看起来真的很接近。我得到这个作为输出:https://gist.github.com/stevenleeg/2b1a2ee9c5400f5f3089 –

+0

只是开玩笑!我回应了结果,而不是导致问题的结果。我所看到的唯一不起作用的是没有频率为0的数据。有什么可以做的吗? –

+0

我不认为这个聚合将包含长度为零的文档的频率值。为了我的频率总数不符合我的特定收藏数量,我正在挠脑袋。 – steveinatorx