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聚合计数数组/集合大小的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb聚合数组大小大于匹配[重复]

MongoDB 聚合两个集合,返回附加字段作为计数

MongoDB(猫鼬)聚合计数集合中特定 ObjectID 的实例

计数字段包含具有聚合mongodb的集合中的数据

MongoDB计数按数组元素分组的数组中的匹配字符串

MongoDB $reduce(aggregation) 组与数组中嵌套文档的总和并按组计数