【问题标题】:Mongodb Aggregation count array/set sizeMongodb聚合计数数组/集合大小
【发布时间】: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 有限制,据我所知,如果输出不适合内存刷新到磁盘或进行表扫描是你唯一的选择。
  • 性能尚可。我只是希望有一种方法来计算数组大小而不返回整个内容。

标签: mongodb aggregation-framework


【解决方案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"}
        }
    }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2018-07-28
    • 2018-06-03
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多