Mongodb聚合计数数组/集大小

时间:2013-01-28 18:05:22

标签: mongodb aggregation-framework

这是我的问题:

型号:

  

{application:“abc”,date:Time.now,status:“1”user_id:[id1,id2,   id4]}

     

{application:“abc”,date:Time.yesterday,status:“1”,user_id:[   id1,id3,id5]}

     

{application:“abc”,date:Time.yesterday-1,status:“1”,user_id:[   id1,id3,id5]}

我需要计算一段时间内唯一的user_id数。

预期结果:

  

{application:“abc”,状态:“1”,unique_id_count:5}

我目前正在使用聚合框架并计算mongodb之外的ID。

  

{$ match:{application:“abc”}},{$ unwind:“$ users”},{$ group:   {_id:{status:“$ status”},              用户:{$ addToSet:“$ users”}}}

我的用户ID数组非常大,所以我必须迭代日期,否则我将获得最大文档限制(16mb)。

我也可以通过

分组
  

{year:{$ year:“$ date”},month:{$ month:“$ date”},day:{   $ dayOfMonth:“$ date”}

但我也得到了文档大小限制。

是否可以在mongodb中计算设置大小?

感谢

3 个答案:

答案 0 :(得分:23)

以下内容将返回每个应用程序的uniqueUsers数。这将通过使用mongodb的管道功能将组操作应用于组操作的结果。

{ $match: { application: "abc" } }, 
{ $unwind: "$users" }, 
{ $group: { _id: "$status", users: { $addToSet: "$users" } } }, 
{ $unwind:"$users" }, 
{ $group : {_id : "$_id", count : {$sum : 1} } }

希望通过一个命令在mongo的以下版本中以更简单的方式完成此操作,该命令在投影下给出数组的大小。 {$project: {id: "$_id", count: {$size: "$uniqueUsers"}}} https://jira.mongodb.org/browse/SERVER-4899

干杯

答案 1 :(得分:2)

对不起,我有点迟到了。只需对'user_id'进行分组并使用一个简单的组计算结果就可以了,并且不会遇到文档大小限制。

[
    {$match: {application: 'abc', date: {$gte: startDate, $lte: endDate}}},
    {$unwind: '$user_id'},
    {$group: {_id: '$user_id'}},
    {$group: {_id: 'singleton', count: {$sum: 1}}}
];

答案 2 :(得分:0)

使用$ size获取集合的大小。

[
    {
        $match: {"application": "abc"}
    },
    {
        $unwind: "$user_id"
    },
    {
        $group: {
            "_id": "$status",
            "application": "$application",
            "unique_user_id": {$addToSet: "$user_id"}
        }
    },
    {
        $project:{
            "_id": "$_id",
            "application": "$application",
            "count": {$size: "$unique_user_id"}
        }
    }
]