2011-01-28 137 views
1

我有一个问题,我不知道如何有效地解决。如何使用MongoDB有效地将数据从一个集合集合到另一个集合中?

我有两个类别:

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的资金用于每一天(可以有每天许多文件包含 不同数量的命中)并以尽可能快的方式用这些总数更新统计数据集合。 这必须完成每个user_id在匹配集合中找到

我可以例如得到聚集点击集合,然后在例如。循环更新统计信息收集。

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

此外,有时候统计信息收集可能有些日子没有文档,所以他们需要创建 而不是更新。

如果你能得到我的任何想法,将是惊人的:)

谢谢 PabloX

回答

3

可能是试图重新设计你的结构

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

,只得到一个包含所有匹配的文档。你可以随时计算总数。

+0

有趣的想法,谢谢:)我很担心,单个文档可以去上面4-8mb限制。但是我会想如果我能改变收集的方式,所以也许这个限制不会成为问题。 – pablox 2011-01-28 17:00:07

0

你的问题似乎是Mongo的map/reduce功能的经典案例。有关更多详细信息,请参阅http://www.mongodb.org/display/DOCS/MapReduce

有一点要注意,但是,与地图/减少。在我使用的Mongo版本(1.4.5)中,执行map/reduce会获取锁定所有读者和作者的数据库锁定。不确定这在Mongo的新版本中是否仍然存在问题。

0

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

这是最有效的方式,除非你真的需要记录每一个命中。

我不知道这是如何与蟒蛇进行,但检查出蒙戈的文档:

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

相关问题