Pet*_*175 4 ruby-on-rails mongoid ruby-on-rails-3
我尝试使用reduce但我不知道如何调用输出.例:
@results = Article.collection.map_reduce(map, reduce, :out => 'test')
@results.find()
=> <Mongo::Cursor:0x2c276c4 namespace='myapp_development.test' @selector={} @cursor_id=>
Run Code Online (Sandbox Code Playgroud)
当我尝试:
@results1 = Article.collection.map_reduce(map, reduce, :out =>{reduce: 'test'}
Run Code Online (Sandbox Code Playgroud)
预期结果是重复@results.但我运行@ results1.find().to_a我认为它与@results相同
如何使用mongoid在rubyrails中调用命名空间的结果?
小智 8
TLTR:你不能有重复的结果.
当map函数发出一些东西时,当reduce函数返回一些东西时,它就是一对[key,value].当存储到集合中时,对于每个条目,输出表示为Mongoid文档,如下所示:
{
"_id" => "my key",
"value" => "my value"
}
Run Code Online (Sandbox Code Playgroud)
我希望在这一点上清楚:Key存储为_id,因此它在集合中是唯一的.
请参阅Map/Reduce输出选项,了解MongoDb在输出到现有集合时如何处理重复键:
replace(默认值):删除现有集合的内容,输出进入
合并:保留现有的集合.当存在具有相同Key(_id)的结果时,将其替换为新映射/缩减的映射.
reduce:保留现有的集合.当存在具有相同Key(_id)的结果时,MongoDB接受它,并采用新映射/缩减的一个,并对其中两个运行reduce函数,并存储结果.
所以,你不能有重复的结果.
编辑:
我在这里回答"你能告诉我如何应用输出减少,以及如何调用集合结果"(因为响应很长):
有很多方法.让我们举一个例子:
class Post
include Mongoid::Document
include Mongoid::Timestamps
field :tags, :type => Array
end
Post.create(:tags => ["Dog", "Cat"])
Post.create(:tags => ["Dog", "Puppy"])
Run Code Online (Sandbox Code Playgroud)
让我们映射/减少这个:
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")
Run Code Online (Sandbox Code Playgroud)
好吧,将结果放在名为"tags"的集合中覆盖它.
我们可以创建一个模型来访问它:
class Tag
include Mongoid::Document
field :value, :type => Hash
end
dog = Tag.find("Dog")
dog._id # => "Dog"
dog.value["count"] # => 2
Run Code Online (Sandbox Code Playgroud)
为了好玩,让我们假设您保留上次执行map/reduce时的时间戳.你可以用reduce它来增量:
Post.where(:created_at.gt => Time.at(my_timestamp)).map_reduce(map, reduce).out(reduce: "tags")
Run Code Online (Sandbox Code Playgroud)
**编辑:固定地图功能**
| 归档时间: |
|
| 查看次数: |
3889 次 |
| 最近记录: |