【发布时间】:2012-06-29 23:43:48
【问题描述】:
我有几个正在运行 mapreduce 的 Mongoid 模型,我想将统一的结果存储在单个 daily_stats 集合中。我的 map & reduce 函数适用于所有 3 个模型,但即使通过 collection.mapreduce(map, reduce, {:out => "daily_stats", :raw => true}) 输出,后续 map reduce 操作的结果也会覆盖以前的结果,即使它们没有重叠键:
{'_id': "2012-06-01", 'values': {photos: 10}}
{'_id': "2012-06-02", 'values': {photos: 10}}
photos 的值在后续传递返回时被丢弃:
{'_id': "2012-06-01", 'values': {comments: 1}}
{'_id': "2012-06-02", 'values': {comments: 6}}
我也尝试与collection.mapreduce(map, reduce, {:out => {:merge => "daily_stats"}, :raw => true}) 合并,但这似乎也不起作用。
有什么想法吗?
更新
每个模型的 map 和 reduce 函数都是这样的:
地图:
function() {
day = Date.UTC(this.created_at.getFullYear(), this.created_at.getMonth(), this.created_at.getDate());
emit(day, {users: 1});
};
减少: 功能(键,值){ var users_added_count = 0;
values.forEach(function(v) {
users_added_count += parseInt(v['users']) || 0;
});
return {users: users_added_count};
}
以下是关于生成的架构的一些额外信息:
{ "_id" : 1337040000000,
"value" : {
"apartments" : 280,
"price" : 1003653,
"photos" : 83,
"comments" : 0 }
}
【问题讨论】:
-
有什么原因你没有和/或不能运行一次 map reduce 并发出一个文档,即:emit(day, {users: 1}, {photos: 1}, {cmets: 1})?
-
哦,我明白了。您最初拥有三个独立的集合 - 一个用于用户、照片和 cmets?我将编写一个示例来说明合并数据的方法。
-
或者来自“结果模式”的文档是您的输入数据模型?抱歉,澄清一下,您能否提供更多数据示例?
标签: mongodb mapreduce mongoid analytics