如何使用MongoDB以有效的方式将数据从一个集合聚合到另一个集合?

时间:2011-01-28 16:27:51

标签: python mongodb mapreduce

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

我有两个系列:

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执行此操作

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

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

有时候,统计数据收集可能在某些日子里没有文档,因此需要创建它们 而不是更新。

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

谢谢你, PabloX

3 个答案:

答案 0 :(得分:3)

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

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

并且只获得一个包含所有匹配的文档。您可以随时计算总数。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

我不确定如何使用python完成此操作,但请查看有关Mongo的文档:

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