2012-05-10 7 views
6

¿Cómo se comprueba si existe un documento incrustado para un documento que utiliza mongoid en Ruby on Rails? Supongamos que tengo un documento user que tiene name, email, y podría tener un documento incrustado nicknames. En este momento si ejecuto user.first.nicknames y si ese user no tiene el documento incrustado nicknames, se producirá un error. He intentado matches? y exists? pero no funcionan.¿Cómo se comprueba si existe un documento incrustado en un documento en mongoid?

Gracias!

Respuesta

3

Esto debería devolver cierto si no existe User.first.nicknames.nil? y esto devolverá verdadero si existe: User.first.nicknames.present?

+0

Ambos no funcionan en un documento mongoDB que no tiene 'apodos'. Produce un error "NoMethodError: undefined method' nicknames' ". Esto funciona para documentos que sí tienen 'apodos' ... – Goalie

+0

Eso no es lo que hace el mío, estoy usando MongoId 2.3.3. Me parece que el 'User.first' es en realidad nulo. Entonces estás tratando de llamar 'apodos' sobre un objeto nulo. ¿Puedes verificar eso? – ctcherry

0

debería ser tan simple como {"user":{"$exists":"nicknames"}}

+0

¿Es este un comando de shell mongo? Estoy buscando una solución en Ruby on Rails. – Goalie

2

Usted puede hacer User.where(:nicknames.exists => true).include?(user).

User.where(:nicknames.exists => true) devolverá solo los documentos que contienen nicknames.

8

Con un poco de ayuda de las otras respuestas aquí, encontré algo que funcionó para mí y creo que esto es lo que el cartel original tenía en mente;

Model.where(:"subdoc.some_attribute".exists => true) 

Esto devolverá todos los documentos donde exista "algún atributo" en el subdocumento. Observe la sintaxis del símbolo, eso es lo que me faltaba.

+0

También puede ir a través de la asociación: 'Model.subdocs.where (: field.exists => true)'. –

+0

Esto es lo que estaba buscando todo el día. No está documentado en ninguna parte? – fre2ak

Cuestiones relacionadas