2

したがって、mapreduce はこれを処理するための最良の方法ではないかもしれませんが、これが私が達成しようとしていることです。

イベントのスキーマと会場のスキーマがあります。各イベントには複数の日付と 0/1 会場があります。イベントの保存時に、可能な日付ごとにエントリを生成し、それを会場情報と一緒に別のコレクションに保存したいと考えています。しかし、2 つの質問/問題があります。

  1. スコープを使用している場合でも、マップ機能から外部のものを呼び出すことができないようで、会場情報を見つけるための呼び出しが失敗します。

  2. 各日付のエントリを生成するのに最適な場所はどこですか? マップ内の日付をループして、日付ごとに出力しますか? またはreduceまたはfinalize関数で?

mapreduce 関数から dbref を呼び出すことができないと言うだけでなく、イベントの保存時に、必要なイベント/会場データを含むオカレンスのコレクションを作成するための最も効率的なソリューションを見つけたいと思います。私は他の方法を受け入れていますが、以下のコードは私のニーズを概説するはずです。

    Event.pre('save', function (next) {

    var o = {};
    o.scope = {Venue: mongoose.model.Venue};
    o.map = function () {

      var data = {dates: this.dates};
      var self = this;
      if(this.venue) {
        Venue.view(this.venue, {}, function(err, doc) {
          if(doc) {
            data.venue_name = doc.name;
          }
          emit(self._id, data);
        });
      } else {
        emit(this._id, data);
      }
    };
    o.reduce = function (k, vals) {
      return vals;
    };
    o.out = { replace: 'occurrences' };
    o.verbose = true;
    mongoose.models.Event.mapReduce(o, function (err, model, stats) {
      next();
    });
    });
4

1 に答える 1

0

map/reduce は、一度に 1 つのコレクションに対して動作します。私の提案は次のとおりです。

  1. イベントを Map/Reduce し、イベント ID と会場 ID を含む日付ごとに 1 回出力します (イベント コレクションに会場 ID があることを願っています)。
  2. 会場 ID を持つすべてのレコードの結果のコレクション ("occurrences") をクエリし、そのドキュメントの会場をクエリしてから、非正規化された会場情報で "occurrences" ドキュメントを更新します。
于 2013-05-30T05:05:56.230 に答える