1

次の MongoDB/Mongoid ドキュメントがあります。

#<Event 
  _id: 51e406a91d41c89fa2000002, 
  namespace: :namespace, 
  bucket: "order_created", 
  data: { 
    "order"=>{
      "id"=>100, 
      "deleted_at"=>nil, 
      "created_at"=>2011-10-06 15:45:04 UTC, 
      "updated_at"=>2013-07-10 16:37:07 UTC, 
      "completed_at"=>2013-07-10 16:37:07 UTC
    }
  }>

イベント クラスの定義は次のとおりです。

class Event
  include Mongoid::Document

  field :namespace, type: Symbol
  field :bucket, type: String
  field :data, type: Hash
end

Mongoid でfind_and_modify メソッドを使用して検索および更新したいのですが、データ フィールドを適切に検索するための検索条件を適切に構成する方法がわかりません。

具体的には、 を見つけたいですdata.order.id = 100。私は運がないので、次のことを試しました:

Event.where(:data.order.id => 100)
Event.where(:'data["order"]["id"]' => 100)
Event.where( { data: { order: { id: 100 } } } )
Event.where( { data: { :"order" => { :"id" => 100 } } }

後者は nil を返しますが、前者 (そして、私が読んだドキュメントから、それを行う正しい方法) はSyntaxError: unexpected ':'.

これは、Mongoid 3.1.4 および MongoDB 2.4.5 で発生します。

4

1 に答える 1

1

私自身の質問に答えます。Event クラスはコレクションを参照していません。これは、Criteria 検索が機能するために重要です。コレクションに対して使用する新しい db オブジェクトをインスタンス化し、find/where メソッドが機能します。次に例を示します。

@db = Mongoid::Sessions.default
@db[:events].find().first['order']
@db[:events].where("data.order.id" => 100).first
于 2013-07-17T01:43:40.650 に答える