TLTR:你不能有重复的结果。
当 map 函数发出一些东西,而 reduce 函数返回一些东西时,它是一对 [key, value]。当存储到集合中时,对于每个条目,输出都表示为 Mongoid 文档,如下所示:
{
"_id" => "my key",
"value" => "my value"
}
我想明确一点:密钥存储为_id
,因此它在集合中是唯一的。
查看Map/Reduce 输出选项以了解 MongoDb 在输出到现有集合时如何处理重复键:
所以,你不能有重复的结果。
编辑:
我在这里回复“你能告诉我如何应用输出减少,以及如何调用收集结果”(因为响应很长):
有很多方法。让我们举一个例子:
class Post
include Mongoid::Document
include Mongoid::Timestamps
field :tags, :type => Array
end
Post.create(:tags => ["Dog", "Cat"])
Post.create(:tags => ["Dog", "Puppy"])
让我们映射/减少这个:
map = %Q{
function() {
this.tags.forEach(function(tag){
emit(tag, { count: 1 });
});
}
}
reduce = %Q{
function(key, values) {
var result = { count: 0 };
values.forEach(function(value) {
result.count += value.count;
});
return result;
}
}
Post.map_reduce(map, reduce).out(replace: "tags")
好的,将结果放入名为“tags”的集合中并覆盖它。
我们可以创建一个模型来访问它:
class Tag
include Mongoid::Document
field :value, :type => Hash
end
dog = Tag.find("Dog")
dog._id # => "Dog"
dog.value["count"] # => 2
为了好玩,假设您保留上次执行 map/reduce 的时间戳。您可以reduce
逐步进行:
Post.where(:created_at.gt => Time.at(my_timestamp)).map_reduce(map, reduce).out(reduce: "tags")
** 编辑:固定地图功能 **