我对map / reduce的理解似乎不够。我想知道我是否可以从集合中选择一个文档子集并运行我的地图并仅在该子集上减少函数。
这一般可能吗?
如果不是,则意味着所有过滤必须在发射之前在地图功能中完成。我已经为我的用例写了一张这样的地图:
map = <<-EOF
function(){
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
};
project_ids = ['#{@project_ids.map{|pid| pid.to_s}.join('\',\'')}'];
if(project_ids.contains(this.project_id.toString())) {
if(this.time.getFullYear() == '#{@year}' && this.time.getMonth() == '#{@month.to_i - 1}') {
emit(
this.time.getDate(),
{
foos: this.stats.foos
}
);
}
}
};
EOF
这是Rails项目的一部分,使用map / reduce实现的方法实际上比纯ruby方法慢3倍。
所以我想知道是否有可能首先使用某些条件过滤我的记录集,然后通过map / reduce运行记录子集以获取我的数据。
任何人都可以开导我吗? Thx提前 菲利克斯
答案 0 :(得分:3)
有。 map / reduce函数的一个参数是“query”,它可以准确地提供你需要的东西。有关详细信息,请查看http://www.mongodb.org/display/DOCS/MapReduce。
答案 1 :(得分:0)
如果您正在使用ORM,那么您通常可以从范围集合中获取选择器并在map-reduce中使用它,例如与Mongoid:
scoped = Project.active.this_year
Project.collection.map_reduce( ..., :query => scoped.selector)