0

我有几个正在运行 mapreduce 的 Mongoid 模型,我想将统一的结果存储在一个daily_stats集合中。我的 map & reduce 函数适用于所有 3 个模型,但即使输出 via 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}}

当后续传递返回时,get 的值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 } 
 }
4

2 回答 2

1

如果您查看 map reduce 的 MongoDB 文档(http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions),您会看到默认情况下,MR 输出集合将任何现有集合替换为相同姓名。“合并”将新数据添加到旧的输出集合中,但使用相同的键覆盖文档。

看起来你的关键是日期?如果

{'_id': "2012-06-01", 'values': {photos: 10}}

{'_id': "2012-06-01", 'values': {comments: 1}}

具有相同的密钥,当您运行 MR 时,第二个文档将替换第一个文档。您要么需要指定一个更唯一的键,要么需要有多个输出集合(可能一个用于照片,一个用于评论?)。

于 2012-06-28T15:28:33.700 回答
0

您可以使用散列键发出,使其在您的模型中唯一

emit({day: day, type: '<model class name>'}, 1);
于 2012-07-12T14:00:21.643 回答