这是我的问题:
型号:
{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中计算设置大小?
感谢
答案 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"}
}
}
]