0

私はこのようなmongodbコレクションを持っています

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

上記のコレクションをステータスが 3 の assigneeId でグループ化し、このように numofdays の値を追加する MongoDB クエリを作成しました。

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

これにより、Mongodb cli から期待どおりの出力が得られます。

同じクエリを実行するための ruby​​ コードを書いたところ、うまく動作しませんでした。同様の問題に対して多くの異なるヒットが発生していますが、どのフォーマットも機能していないようです。グループ化関数の ruby​​ の構文エラーを回避できませんでした。私はモンゴイドを使用していないことに注意してください。集約フレームワークでこの作業を行うことができれば、それも問題ありません。

これは私が書いた 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: 構文エラー、予期しない ')'、keyword_end が必要ですanalyze.rb:83: 構文エラー、予期しない入力の終わり、keyword_end が必要です

どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

0

次のテストには、グループと集計の両方の方法を使用するためのソリューションが含まれています。集計を使用することをお勧めします。これはより高速で、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

$ ruby​​ test.rb

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
于 2014-05-07T19:32:00.520 に答える