2017-05-26 219 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字段值的文档。

相关问题