2013-07-30 229 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