3

更新するコレクションをスコープ変数として渡そうとしました-サイコロはありません。db.getCollection私はファイナライズ本体から呼び出そうとしました-サイコロはありません、私はこれを取得します:

db assertion failure, assertion: 'invoke failed: JS Error: TypeError: db has no properties nofile_b:18', assertionCode: 9004

私はそれdbがファイナライズメソッド内で未定義であることを意味すると思います。それで、それは可能ですか?

編集

これが私のファイナライズ方法です:

function(key, value) {
  function flatten(value, collector) {
    var items = value;
    if (!(value instanceof Array)) {
      if (!value.items) {
        collector.push(value);
        return;
      }

      items = value.items;
    }
    for (var i = 0; i < items.length && collector.length < max_group_size; ++i) {
      flatten(items[i], collector);
    }
  }

  var collector = [];
  flatten(value, collector);
  return collector;
}

collector.push(value)いくつかのコレクションへの挿入に置き換えたいと思います。

4

1 に答える 1

2

Map/Reduce/Finalize 関数内から別のコレクションを変更することはできません。

これは、同様の質問を持つユーザーからの質問へのリンクです。残念ながら、答えは「いいえ」です。
MongoDB の map-reduce の結果の構造を変更するには?

その理由の 1 つは、MapReduce がシャード環境で動作するように設計されていることです。計算はさまざまなシャードに分散され、結果が集計されます。各シャードで実行されている各関数がコレクションを変更できる場合、各シャードは異なるデータになる可能性があります。

Map Reduce 操作の結果として別のコレクションを変更する場合、最適な方法は、Map Reduce 操作を実行して結果を取得し、アプリケーションで別のコレクションを更新することです。

複数の Map Reduce 操作の結果をマージしたい場合は、増分 Map Reduce を介してこれを行うことができます。これに関するドキュメントは、http ://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce にあります。

于 2012-04-04T14:59:07.373 に答える