【发布时间】: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