所以mapreduce可能不是处理这个问题的最佳方法,但这就是我想要实现的。
我有一个事件模式和场地模式。每个活动有多个日期和0/1场地。我希望在事件保存时,为每个可能的日期生成条目,并将其与场地信息一起存储在另一个集合中-例如事件。但是我有两个问题。
-
我似乎无法从地图函数调用外部的东西,即使使用范围,所以我调用查找场地信息失败。
-
为每个日期生成条目的最佳位置在哪里?循环通过日期在地图和emit为每个日期?或者在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();
});
});
map/reduce一次操作一个集合。我的建议是:
- 映射/减少事件,并为每个日期发出一次,包括事件ID和场地ID(希望您在事件集合中有场地ID)
- 查询具有场地ID的所有记录的结果集合("occurrences"),为该文档查询场地,然后用非规范化的场地信息更新"occurrences"文档。