0

Rails 3.2.14、Ruby 1.9.3、Mongoid 3.1.5 の使用:

次のようなドキュメントに対してクエリを実行しています。

{
   paid_on: ISODate("2013-03-08T22:25:24.973Z"),
   paid_amt: 25.5
}

時々paid_onは ですがnull、それらのドキュメントもキャプチャする必要があるため、$ifNullを使用してデフォルトの日付を代用しようとしていました:

Claim.collection.aggregate(
    {
        "$project" => {
            "paid_on"  => {"$ifNull" => ["$paid_on", Date.new(1980, 1, 1).mongoize]},
            "paid_amt" => 1,
        }
    }
)

Mongo に送信されるクエリは次のようになります ($project 部分をキャプチャしただけです)。

{
"$project"=>{
     "paid_on" => {"$ifNull"=>["$paid_on", 1980-01-01 00:00:00 UTC]},
     "paid_amt" => 1
 }

そして失敗します:

エラー 16006 で失敗しました:「例外: BSON タイプの文字列から日付に変換できません」

私は運がない日付を送信するためにいくつかの他の方法を試しました:

  • 'ISODate("1980-01-01")'
  • { "$日付" => 315554400000 }
4

1 に答える 1

1

以下は私にとってはうまくいきます。再作成して、コードとの違いを確認することをお勧めします。

モデル/アプリ/claim.rb

class Claim
  include Mongoid::Document
  field :paid_on, type: Time
  field :paid_amt, type: Float
end

テスト/ユニット/claim_test.rb

require 'test_helper'
require 'pp'

class ClaimTest < ActiveSupport::TestCase
  def setup
    Claim.delete_all
  end

  test "replace null date field" do
    docs = [
        {
            :paid_on => DateTime.parse("2013-03-08T22:25:24.973Z"),
            :paid_amt => 25.5
        },
        {
            :paid_on => nil,
            :paid_amt => 12.25
        }
    ]
    Claim.create(docs)
    pipeline = [
        {
            "$project" => {
                "paid_on" => {"$ifNull" => ["$paid_on", Date.new(1980, 1, 1).mongoize]},
                "paid_amt" => 1
            }
        }
    ]
    puts "\nMongoid::VERSION:#{Mongoid::VERSION}\nMoped::VERSION:#{Moped::VERSION}"
    puts "pipeline:#{pipeline.inspect}"
    pp Claim.collection.aggregate(pipeline)
  end
end

$レーキテスト

Run options: 

# Running tests:

[1/1] ClaimTest#test_replace_null_date_field
Mongoid::VERSION:3.1.5
Moped::VERSION:1.5.1
pipeline:[{"$project"=>{"paid_on"=>{"$ifNull"=>["$paid_on", 1980-01-01 00:00:00 UTC]}, "paid_amt"=>1}}]
[{"_id"=>"5272720a7f11ba4293000001",
  "paid_on"=>2013-03-08 22:25:24 UTC,
  "paid_amt"=>25.5},
 {"_id"=>"5272720a7f11ba4293000002",
  "paid_on"=>1980-01-01 00:00:00 UTC,
  "paid_amt"=>12.25}]
Finished tests in 0.039125s, 25.5591 tests/s, 0.0000 assertions/s.
1 tests, 0 assertions, 0 failures, 0 errors, 0 skips
于 2013-10-31T15:07:36.940 に答える