Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Mongoid上MapReduce的难点_Ruby_Mongodb_Mapreduce_Ruby On Rails 3.2_Mongoid - Fatal编程技术网

Ruby Mongoid上MapReduce的难点

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

我很难用MongoDB和mongoid在Ruby中创建MapReduce函数。我正在使用,而且内容似乎不是为Mongoid编写的(尽管它是在rails 3.2之后编写的)

下面是一个示例JSON文档:

> 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不需要附加该方法。