0

daily_statsmapreduce を実行している複数の Mongoid モデルがあり、統合された結果を 1 つのコレクションに格納したいと考えています。私の 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後続のパスが返されたときにスローされる getの値:

{'_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});
  };

Reduce: 関数 (キー、値) { 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 を実行すると、2 番目のドキュメントが最初のドキュメントに置き換わります。より一意のキーを指定するか、複数の出力コレクション (写真用とコメント用など) を用意する必要があります。

于 2012-06-28T15:28:33.700 に答える
0

モデル全体で一意にするためにハッシュキーを使用して発行できます

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