2012-09-14 15 views
10

Chúng tôi có một mô hình nhập cảnh với mục nhúng:Mongoid 2.4 Truy vấn Đối với tài liệu Embedded By Id Không

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 
... 

Nếu tôi truy vấn Mongo trực tiếp cho mục nhập bằng id mục:

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

Nó trả về Entry:

505363b36181ce00020006b1 { "created_at": "2012-09-14T17: 04: 51Z", "mặt hàng": [{ "_ id": "50536b1a2b17b3 .. .

Tuy nhiên, khi tôi truy vấn qua Mongoid:

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

Mọi thắc mắc khác làm việc (đối với các lĩnh vực khác vào các mặt hàng và cho các lĩnh vực nhập cảnh). Nhưng không phải cho id.

Chúng tôi đang chạy mongoid (2.4.12).

Trả lời

19

Rõ ràng bạn phải quấn ID trong BSON :: ObjectId(), vì vậy:

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

Nếu không Mongo sẽ sporatically không trả về kết quả.

+9

Hoặc trong trường hợp của tôi, 'Moped :: BSON :: ObjectId ('50536b18baa072000f000360')', để chữa bệnh 'phương pháp xác định \ '__bson_dump__' cho BSON :: ObjectId'. Whew! –

+0

Sử dụng Xe máy :: BSON :: ObjectId trong Mongoid 3 – Obie

+1

Điều này sẽ không hoạt động đối với Mongoid 4.0.0.beta1 –

0

Entry.where('items._id' => Moped::BSON::ObjectId('50536b18baa072000f000360'))[0] xem tài liệu here

-3

Alternative, điều này cũng sẽ làm việc.

Entry.find('50536b18baa072000f000360') 
Các vấn đề liên quan