【问题标题】:How to aggregate data from one collection into another in efficient way using MongoDB?如何使用 MongoDB 以有效的方式将数据从一个集合聚合到另一个集合?
【发布时间】:2011-06-17 08:47:58
【问题描述】:

我有一个问题,我不确定如何有效地解决。

我有两个收藏:

1)

hits = {
    'day': '',
    'number_of_hits': 0
    'user_id': 0
} 

2)

stats = {
    'day': '',
    'total_number_of_hits': 0
    'user_id': 0
    ...
    some other stuff
}

我需要每天获取 number_of_hits 的总和(每天可能有很多文档包含 各种点击数)并以尽可能快的方式用这些总和更新统计信息集合。 必须对 hits 集合中的每个 user_id 执行此操作

例如,我可以获取命中集合的聚合,然后在例如。循环更新统计信息集合。

但有些事情告诉我这不是一个好方法。

此外,有时统计信息集合可能有几天没有文档,因此需要创建它们 而不是更新。

如果你能给我任何想法,那就太棒了:)

谢谢你, PabloX

【问题讨论】:

    标签: python mongodb mapreduce


    【解决方案1】:

    可能会尝试将您的结构重新设计为

    stats{
       'day': '',
       'user_id': 0,
       'hits':{ 
           // Array of your hits document
        }
    }
    

    并且只得到一个包含所有命中的文档。您可以随时计算总计。

    【讨论】:

    • 有趣的想法,谢谢 :) 我担心单个文档可能会超过 4-8mb 的限制。但我会想如果我可以改变收集点击的方式,那么这个限制可能不会成为问题。
    • 它还减少了与数据库的连接数。
    【解决方案2】:

    您的问题似乎是 Mongo 的 map/reduce 功能的经典案例。详情请见http://www.mongodb.org/display/DOCS/MapReduce

    不过,使用 map/reduce 需要注意一点。在我使用的 Mongo 版本(1.4.5)上,执行 map/reduce 会获取数据库上的锁,该锁会锁定所有读取器和写入器。不确定在较新版本的 Mongo 中这是否仍然是一个问题。

    【讨论】:

      【解决方案3】:

      另一个想法是使用 $inc 运算符进行更新 基本上,如果存在与 user_id 和 date 匹配的文档,则只需将 hits 增加 1,否则插入 1。

      这是最有效的方式,除非你真的需要记录每一次点击。

      我不确定这是如何使用 python 完成的,但请查看 Mongo 上的文档:

      http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

      【讨论】:

        猜你喜欢
        • 2013-06-17
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2016-07-04
        • 2020-08-31
        • 2020-01-09
        相关资源
        最近更新 更多