ruby-on-rails – mongoid,如何将结果与map / reduce合并
我尝试使用reduce但我不知道如何调用输出.
例: @results = Article.collection.map_reduce(map,reduce,:out => 'test') @results.find() => <Mongo::Cursor:0x2c276c4 namespace='myapp_development.test' @selector={} @cursor_id=> 当我尝试: @results1 = Article.collection.map_reduce(map,:out =>{reduce: 'test'} 预期结果是重复@results.但我运行@ results1.find().to_a我认为它与@results相同 如何使用mongoid在rubyrails中调用命名空间的结果? 解决方法
TLTR:你不能有重复的结果.
当map函数发出一些东西时,当reduce函数返回一些东西时,它就是一对[key,value]. { "_id" => "my key","value" => "my value" } 我想明确这一点:Key存储为_id,因此它在集合中是唯一的. 请参阅Map/Reduce output options以了解MongoDb在输出到现有集合时如何处理重复键: > replace(默认值):删除现有集合的内容,输出进入 所以,你不能有重复的结果. 编辑: 我在这里回答“你能告诉我如何应用输出减少,以及如何调用集合结果”(因为响应很长): 有很多方法.让我们举一个例子: 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") **编辑:固定地图功能** (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |