Mongodb聚合计数数组/集合大小
Posted
技术标签:
【中文标题】Mongodb聚合计数数组/集合大小【英文标题】:Mongodb Aggregation count array/set size 【发布时间】:2013-01-12 03:50:51 【问题描述】:这是我的问题:
型号:
应用程序:“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]
我需要统计一段时间内user_id的唯一数量。
预期结果:
应用程序:“abc”,状态:“1”,unique_id_count:5
我目前正在使用聚合框架并计算 mongodb 之外的 id。
$match: application: "abc" , $unwind: "$users" , $group: _id:状态:“$状态”, 用户: $addToSet: "$users"
我的用户 ID 数组非常大,所以我必须迭代日期,否则我将获得最大文档限制 (16mb)。
我也可以 $group by
年: $year: "$date" , 月: $month: "$date" , 日: $dayOfMonth: "$date"
但我也得到了文档大小限制。
mongodb中可以统计set size吗?
谢谢
【问题讨论】:
每个用户的 id 是否超过 16mb,或者所有记录的数据是否超过 16mb?如果后一种情况不存在,您可以尝试将结果刷新到输出集合。 用户数组/集合大小大于一千,用户ID类似于object_ids(50b9d949816e6e37060005c2)。以前的版本使用 map/reduce 和输出集合。它慢得可怕。在内存中计数比编写输出集合要快。 当您进行表扫描并仅检索 application 和 userId 字段时,性能如何。当然,在内存中计数会更快,但你对 mongo 有限制,据我所知,如果输出不适合内存刷新到磁盘或进行表扫描是你唯一的选择。 性能尚可。我只是希望有一种方法来计算数组大小而不返回整个内容。 【参考方案1】:以下将返回每个应用程序的唯一用户数。这将通过使用 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
干杯
【讨论】:
这是在 2.5.3 版本中添加的(当前为开发版本) 您的示例 $project: id: "$_id", count: $size: "$uniqueUsers" 在 2.6 版中为我工作。谢谢!【参考方案2】:抱歉,我参加聚会有点晚了。简单地对 'user_id' 进行分组并用一个简单的组计算结果就可以了,并且不会遇到文档大小限制。
[
$match: application: 'abc', date: $gte: startDate, $lte: endDate,
$unwind: '$user_id',
$group: _id: '$user_id',
$group: _id: 'singleton', count: $sum: 1
];
【讨论】:
它也不满足“我需要计算一段时间内的唯一用户ID数”的问题,OP已经知道如何在每个时间段内完成。【参考方案3】:使用 $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"
]
【讨论】:
以上是关于Mongodb聚合计数数组/集合大小的主要内容,如果未能解决你的问题,请参考以下文章