12

这是我的问题:

模型:

{应用程序:“abc”,日期:Time.now,状态:“1” user_id:[id1,id2,id4]}

{应用程序:“abc”,日期:Time.yesterday,状态:“1”,user_id:[id1,id3,id5]}

{应用程序:“abc”,日期:Time.yesterday-1,状态:“1”,user_id:[id1,id3,id5]}

我需要计算一段时间内的唯一用户ID数。

预期结果:

{ 应用程序:“abc”,状态:“1”,unique_id_count:5 }

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

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

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

我也可以 $group by

{ 年: { $year: "$date" }, 月: { $month: "$date" }, 日: { $dayOfMonth: "$date" }

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

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

谢谢

4

3 回答 3

24

以下将返回每个应用程序的 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

干杯

于 2013-01-28T19:16:30.260 回答
2

对不起,我参加聚会有点晚了。简单地对“user_id”进行分组并用一个简单的组计算结果就可以了,并且不会遇到文档大小限制。

[
    {$match: {application: 'abc', date: {$gte: startDate, $lte: endDate}}},
    {$unwind: '$user_id'},
    {$group: {_id: '$user_id'}},
    {$group: {_id: 'singleton', count: {$sum: 1}}}
];
于 2013-01-28T20:38:32.587 回答
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"}
        }
    }
]
于 2019-04-24T09:44:48.923 回答