使用mongo聚合框架计算每个用户的数据

时间:2017-05-26 14:17:52

标签: mongodb mongodb-query aggregation-framework

我有一个集合,其中每个文档都包含user_ids作为属性,这是一个Array字段。示例文档将是:

[{
  _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 个答案:

答案 0 :(得分:2)

您需要$unwind" user_ids"数组并在$group阶段计算每个" id"出现在收藏中。

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

答案 1 :(得分: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'
            }
        },

    ]


);

在上面的聚合查询中,$ unwind运算符最初将每个文档的数组字段user_ids分解为数组字段的每个元素的多个文档,然后按照每个文档中包含的user_ids字段的值对文档进行分组,并对每个值执行文档求和of user_ids字段。