Ruby Mongoid上MapReduce的难点
我很难用MongoDB和mongoid在Ruby中创建MapReduce函数。我正在使用,而且内容似乎不是为Mongoid编写的(尽管它是在rails 3.2之后编写的) 下面是一个示例JSON文档:Ruby Mongoid上MapReduce的难点,ruby,mongodb,mapreduce,ruby-on-rails-3.2,mongoid,Ruby,Mongodb,Mapreduce,Ruby On Rails 3.2,Mongoid,我很难用MongoDB和mongoid在Ruby中创建MapReduce函数。我正在使用,而且内容似乎不是为Mongoid编写的(尽管它是在rails 3.2之后编写的) 下面是一个示例JSON文档: > db.books.find() { "_id" : ObjectId("50ceb8551d41c8ade7000041"), "author_id" : ObjectId("50ceb72c1d41c8ade700003d"), "category_ids" : [ ], "nam
> db.books.find()
{ "_id" : ObjectId("50ceb8551d41c8ade7000041"),
"author_id" : ObjectId("50ceb72c1d41c8ade700003d"),
"category_ids" : [ ], "name" : "Great Expectations",
"votes" : [
{ "username" : "Gautam", "rating" : 9 },
{ "username" : "Tom", "rating" : 3 },
{ "username" : "Dick", "rating" : 7 }
]
}
总之,我在mongoid MapReduce上遇到了麻烦。我可以在MongoDB中运行此罚款:
> var reduce = function(key, values) {
var result = {rating: 0};
values.forEach(function(value) {
result.rating += value.rating;
});
return result;
};
> var map = function() {
this.votes.forEach(function(x) {
emit(x.username, {rating: x.rating});
});
};
> var results = db.books.mapReduce(map, reduce, {out: "mr_results"});
> results
{
"result" : "mr_results",
"timeMillis" : 28,
"counts" : {
"input" : 2,
"emit" : 6,
"reduce" : 3,
"output" : 3
},
"ok" : 1,
}
> results.find()
{ "_id" : "Dick", "value" : { "rating" : 10 } }
{ "_id" : "Gautam", "value" : { "rating" : 15 } }
{ "_id" : "Tom", "value" : { "rating" : 10 } }
但当我在Rails控制台中运行以下命令时,我得到了以下结果:
1.9.3-p327 :292 > map = "function() {
1.9.3-p327 :293"> this.votes.forEach(function(x) {
1.9.3-p327 :294"> emit(x.username, {x.rating});
1.9.3-p327 :295"> });
1.9.3-p327 :296"> }
1.9.3-p327 :297"> "
=> "function() {\nthis.votes.forEach(function(x) {\nemit(x.username, {x.rating});\n});\n}\n"
1.9.3-p327 :298 > reduce = "function(key, values) {
1.9.3-p327 :299"> var result = {rating: 0};
1.9.3-p327 :300"> values.forEach(function(value) {
1.9.3-p327 :301"> result.rating += value.rating;
1.9.3-p327 :302"> });
1.9.3-p327 :303"> return result;
1.9.3-p327 :304"> }
1.9.3-p327 :305"> "
=> "function(key, values) {\nvar result = {rating: 0};\nvalues.forEach(function(value) {\nresult.rating += value.rating;\n});\nreturn result;\n}\n"
1.9.3-p327 :306 > results = Book.where(votes: 1).map_reduce(map,reduce).out(inline: 1)
=> #<Mongoid::Contextual::MapReduce
selector: {"votes"=>1}
class: Book
map: function() {
this.votes.forEach(function(x) {
emit(x.username, {x.rating});
});
}
reduce: function(key, values) {
var result = {rating: 0};
values.forEach(function(value) {
result.rating += value.rating;
});
return result;
}
finalize:
out: {:inline=>1}>
1.9.3-p327 :307 > results.find()
=> #<Enumerator: #<Mongoid::Contextual::MapReduce
selector: {"votes"=>1}
class: Book
map: function() {
this.votes.forEach(function(x) {
emit(x.username, {x.rating});
});
}
reduce: function(key, values) {
var result = {rating: 0};
values.forEach(function(value) {
result.rating += value.rating;
});
return result;
}
finalize:
out: {:inline=>1}>
:find>
1.9.3-p327:292>map=“function(){
1.9.3-p327:293“>此功能(x){
1.9.3-p327:294“>emit(x.username,{x.rating});
1.9.3-p327:295“>});
1.9.3-p327:296“>}
1.9.3-p327:297“>”
=>“function(){\n此.voates.forEach(function(x){\n名称,{x.rating});\n}”;\n}\n”
1.9.3-p327:298>reduce=“功能(键、值){
1.9.3-p327:299“>风险值结果={评级:0};
1.9.3-p327:300“>值。forEach(功能(值){
1.9.3-p327:301“>result.rating+=value.rating;
1.9.3-p327:302“>});
1.9.3-p327:303“>返回结果;
1.9.3-p327:304“>}
1.9.3-p327:305“>”
=>“函数(键,值){\nvar结果={rating:0};\n值.forEach(函数(值){\nresult.rating+=value.rating;\n});\n返回结果;\n}\n”
1.9.3-p327:306>结果=Book.where(投票数:1).map\u reduce(map,reduce).out(内联:1)
=> #1}
班级:书本
map:function(){
this.devots.forEach(函数(x){
emit(x.username,{x.rating});
});
}
减少:功能(键、值){
var结果={评级:0};
values.forEach(函数(值){
result.rating+=value.rating;
});
返回结果;
}
最后确定:
输出:{:inline=>1}>
1.9.3-p327:307>结果。查找()
=> #1}>
:查找>
或者,如果我将out结果更改为“mr_results”,则会发生以下情况:
1.9.3-p327 :383 > results = Book.map_reduce(map,reduce).out("mr_results")
NoMethodError: undefined method `update_values' for "mr_results":String
from /home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/mongoid-3.0.14/lib/mongoid/contextual/map_reduce.rb:134:in `out'
from (irb):383
from /home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/commands/console.rb:47:in `start'
from /home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/commands/console.rb:8:in `start'
from /home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
1.9.3-p327:383>结果=Book.map\u reduce(map,reduce).out(“mr\u结果”)
NoMethodError:“mr_结果”的未定义方法“update_values”:String
from/home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/mongoid-3.0.14/lib/mongoid/context/map_reduce.rb:134:in“out”
发信人(irb):383
from/home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/commands/console.rb:47:在“开始”中
from/home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/commands/console.rb:8:in'start'
from/home/BSP/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/commands.rb:41:in`'
来自脚本/rails:6:in'require'
来自脚本/rails:6:in`'
如何使此输出成为书本投票的预期结果?函数要求的是散列,而不是字符串:
results = Book.map_reduce(map,reduce).out(:replace => "mr_results")
out
函数需要的是散列,而不是字符串:
results = Book.map_reduce(map,reduce).out(:replace => "mr_results")
是的-@robbrit是对的。您需要使用replace:“mr_results”来获得与本书中相同的结果。Mongoid 3.0是在我的书发布几周后发布的,所以语法有点变化。谢谢!在看到这一点并发现Mongoid被“延迟评估”后,我能够将我需要看到的结果。find()。返回到a或results.find()。条目,其中Mongo不需要附加该方法。是-@robbrit是正确的。您需要使用replace:“mr_results”来获得与本书中相同的结果。Mongoid 3.0是在我的书发布几周后发布的,所以语法有点变化。谢谢!在看到这一点并发现Mongoid被“延迟评估”后,我可以将需要查看的结果返回到results.find()。或results.find()。条目,其中Mongo不需要附加该方法。