简体   繁体   中英

Mongoid 2.4 Querying For Embedded Document By Id Failing

We have a model Entry with an embedded Item:

class Entry
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Spacial::Document
  embeds_many :items, cascade_callbacks: true
...

class Item
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Spacial::Document
  embedded_in :entry
...

If i query mongo directly for an entry by item id:

{"items._id" : ObjectId("50536b18baa072000f000360")}

It returns the Entry:

505363b36181ce00020006b1 {"created_at":"2012-09-14T17:04:51Z","items":[{"_id":"50536b1a2b17b3...

Yet when i query via Mongoid:

irb(main):002:0> Entry.where('items._id' => '50536b18baa072000f000360')[0]
=> nil

All other queries work (for other fields on items and for fields on entry). But not for id.

We're running mongoid (2.4.12).

Apparently you have to wrap the ID in BSON::ObjectId(), so:

Entry.where('items._id' => BSON::ObjectId('50536b18baa072000f000360'))[0]

Otherwise mongo will sporatically not return the result.

This works with Mongoid 4.0.0.beta1:

Entry.where('items._id' => BSON::ObjectId.from_string('50536b18baa072000f000360'))

Here is the link to the documentation.

http://api.mongodb.org/ruby/current/BSON/ObjectId.html#from_string-class_method

Entry.where('items._id' => Moped::BSON::ObjectId('50536b18baa072000f000360'))[0]请参阅此处的文档

替代方案,这也将起作用。

Entry.find('50536b18baa072000f000360')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM