2017-05-26 282 views
0

我有一個集合,其中每個文檔都包含user_id作爲屬性,它是一個Array字段。例如文件(S)將是:使用mongo聚合框架計算每個用戶的數據

[{ 
    _id: 'i3oi1u31o2yi12o3i1', 
    unique_prop: 33, 
    prop1: 'some string value', 
    prop2: 212, 
    user_ids: [1, 2, 3 ,4] 
}, 
{ 
    _id: 'i3oi1u88ffdfi12o3i1', 
    unique_prop: 34, 
    prop1: 'some string value', 
    prop2: 216, 
    user_ids: [2, 3 ,4] 
}, 
{ 
    _id: 'i3oi1u8834432ddsda12o3i1', 
    unique_prop: 35, 
    prop1: 'some string value', 
    prop2: 211, 
    user_ids: [2] 
}] 

我的目標是讓每個用戶的文件數量,所以樣本輸出將是:

[ 
{user_id: 1, count: 1}, 
{user_id: 2, count: 3}, 
{user_id: 3, count: 2}, 
{user_id: 4, count: 2} 
] 

我已經試過幾件事情沒有的,其中工作,最後我嘗試過:

aggregate([ 
    { $group: { 
    _id: { unique_prop: "$unique_prop"}, 
    users: { "$addToSet": "$user_ids" }, 
    count: { "$sum": 1 } 
    }} 
] 

但它只是返回了每個文檔的用戶。我仍然試圖學習任何資源或建議會有所幫助。

回答

2

您需要$unwind「user_ids」數組和$group階段計算每個「id」在集合中出現的次數。

db.collection.aggregate([ 
    { "$unwind": "$user_ids" }, 
    { "$group": { "_id": "$user_ids", "count": {"$sum": 1 }}} 
]) 
+0

謝謝!這是整潔! – Mongoid

0

MongoDB聚合對來自集合中文檔的值組執行計算,並通過在管道中執行其各個階段返回計算結果。

根據上述說明,請嘗試在MongoDB shell中執行以下聚合查詢。

db.collection.aggregate(

    // Pipeline 
    [ 
     // Stage 1 
     { 
      $unwind: "$user_ids" 
     }, 

     // Stage 2 
     { 
      $group: { 
       _id:{user_id:'$user_ids'}, 
       total:{$sum:1} 
      } 
     }, 

     // Stage 3 
     { 
      $project: { 
       _id:0, 
       user_id:'$_id.user_id', 
       count:'$total' 
      } 
     }, 

    ] 


); 

在上述聚集查詢起初$放鬆操作者把每一個文檔到數組字段的每個元件的多個文檔的包含成每個文檔的陣列字段user_ids,然後將其組文件通過user_ids字段的值,並執行的求和每個user_ids字段值的文檔。

相關問題