2012-09-14 19 views
10

Tenemos una entrada de modelo con un elemento incrustado:Mongoid 2.4 Consultando documento incrustado por ID A falta

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

Si yo consulto Mongo directamente para una entrada por ID:

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

Devuelve la Entrada:

505363b36181ce00020006b1 { "created_at": "2012-09-14T17: 04: 51Z", "artículos": [{ "_ id": "50536b1a2b17b3 .. .

Sin embargo, cuando consulta a través Mongoid:

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

Todas las demás funcionan las consultas (para otros campos en los artículos y para campos de entrada). Pero no para id.

Estamos ejecutando mongoid (2.4.12).

Respuesta

19

Al parecer, usted tiene que envolver el ID de BSON :: OBJECTID(), así:

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

De lo contrario mongo se sporatically no devolver el resultado.

+9

o en mi caso, 'ciclomotor :: :: BSON OBJECTID ('50536b18baa072000f000360')', con el fin de curar 'método no definido \' __bson_dump__' para BSON :: ObjectId'. ¡Uf! –

+0

Utilice Moped :: BSON :: ObjectId en Mongoid 3 – Obie

+1

Esto no funcionará para Mongoid 4.0.0.beta1 –

0

Entry.where('items._id' => Moped::BSON::ObjectId('50536b18baa072000f000360'))[0] ver la documentación here

-3

alternativa, esto también va a funcionar.

Entry.find('50536b18baa072000f000360') 
Cuestiones relacionadas