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. 映射/减少事件并为每个日期发出一次,包括事件 ID 和场地 ID(希望您在事件集合中有场地 ID)
  2. 查询所有具有场所 ID 的记录的结果集合(“发生”),查询该文档的场所,然后使用非规范化场所信息更新“发生”文档。
于 2013-05-30T05:05:56.230 回答