我有一个问题,我不确定如何有效地解决。
我有两个系列:
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
答案 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