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 回答