Ruby中的Mongo组函数调用

Ruby中的Mongo组函数调用,ruby,mongodb-ruby,Ruby,Mongodb Ruby,我有一个像这样的mongodb系列 {“assigneeId”=>1000,“status”=>3,“starttime”=>2014年2月25日”,“numofdays=>6} {“assigneeId”=>1000,“status”=>2,“starttime”=>2014年1月10日”,“numofdays=>6} {“assigneeId”=>1000,“status”=>3,“starttime”=>2014年1月1日”,“numfodays=>20} 我编写了一个MongoDB查询,

我有一个像这样的mongodb系列

{“assigneeId”=>1000,“status”=>3,“starttime”=>2014年2月25日”,“numofdays=>6} {“assigneeId”=>1000,“status”=>2,“starttime”=>2014年1月10日”,“numofdays=>6} {“assigneeId”=>1000,“status”=>3,“starttime”=>2014年1月1日”,“numfodays=>20}

我编写了一个MongoDB查询,用状态为3的assigneeId对上述集合进行分组,并像这样添加numofdays的值

db.events.group({key:{assigneeId:1},cond:{status:{$gte:3}},reduce:function(curr,result){result.total++;result.numodies+=curr.numodies;},initial:{total:0,numodies:0})

这将提供Mongodb cli的预期输出

当我编写用于执行同一查询的ruby代码时,我无法使其正常工作。对于类似的问题,我得到了很多不同的结果,但似乎没有一种格式能够正常工作。我无法通过ruby中的语法错误进行分组。请注意,我没有使用mongoid。如果我可以通过聚合框架完成这项工作,这也是一个问题跟我来

这是我编写的ruby查询,也是同样的错误

@events_h.group (
                :cond => {:status => { '$in' => ['3']}},
                :key => 'assigneeId',
                :initial => {count:0},
                :reduce => "function(x, y) {y.count += x.count;}"
                )
我犯了一个错误

analyze.rb:43:语法错误,意外“,”,应为“)” out=@events_h.group([“assigneeId”],{},{},“function(){}”) ^ analyze.rb:43:语法错误,意外“'),应为关键字_end analyze.rb:83:语法错误,输入意外结束,应为关键字\u end

非常感谢您的帮助


谢谢

以下测试包括使用分组和聚合两种方法的解决方案。 我建议您使用aggregate,它速度更快,避免了JavaScript和使用V8引擎。 希望这有帮助

test.rb

require 'mongo'
require 'test/unit'

class MyTest < Test::Unit::TestCase
  def setup
    @events_h = Mongo::MongoClient.new['test']['events_h']
    @docs = [
        {"assigneeId" => 1000, "status" => 3, "starttime" => "2014 Feb 25", "numofdays" => 6},
        {"assigneeId" => 1000, "status" => 2, "starttime" => "2014 Jan 10", "numofdays" => 6},
        {"assigneeId" => 1000, "status" => 3, "starttime" => "2014 Jan 1", "numofdays" => 20}]
    @events_h.remove
    @events_h.insert(@docs)
  end

  test "group" do
    result = @events_h.group(
        :cond => {:status => {'$in' => [3]}},
        :key => 'assigneeId',
        :initial => {numofdays: 0},
        :reduce => "function(x, y) {y.numofdays += x.numofdays;}"
    )
    assert_equal(26, result.first['numofdays'])
    puts "group: #{result.inspect}"
  end

  test "aggregate" do
    result = @events_h.aggregate([
        {'$match' => {:status => {'$in' => [3]}}},
        {'$group' => {'_id' => '$status', 'numofdays' => {'$sum' => '$numofdays'}}}
    ])
    assert_equal(26, result.first['numofdays'])
    puts "aggregate: #{result.inspect}"
  end
end

而不是
(y.count+=x.count;}
中应该有
{
,这里是错误。第一个错误仍然没有解决。分析。rb:44:语法错误,意外=>,预期'):cond=>{:status=>{'$in'=>['3']},^analyze.rb:44:语法错误,意外“}”,应为关键字_end:cond=>{:status=>{'$in'=>['3']}^
Loaded suite test
Started
aggregate: [{"_id"=>3, "numofdays"=>26}]
.group: [{"assigneeId"=>1000.0, "numofdays"=>26.0}]
.

Finished in 0.010575 seconds.

2 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed

189.13 tests/s, 189.13 assertions/s