2011-05-25 15 views
6

¿Qué es un buen patrón para consultar documentos incrustados en un documento? Por ejemplo, mi documento de usuario tiene un documento Alerts incrustado. Si quiero ver si un determinado usuario tiene una alerta con el nombre que puedo hacerlo de dos maneras por lo que yo puedo decir - en memoria a laConsultar documentos incrustados en un documento con MongoMapper

alert = current_user.alerts.select{|a| a.name == params[:name]}.first

oa través de la interfaz de documento real a la (en cuenta que no estoy 100% seguro de que esto es semánticamente válida, pero usted consigue el punto):

User.where('alerts.name' => params[:name], :id => current_user.id).first

tiene que haber una manera mejor, algo así como

current_user.alerts.where(:name => params[:name])

quizás? O tal vez solo no estoy pensando en el problema ¿verdad?

+0

lo siento, no puedo responder a su pregunta directamente (no la suficiente experiencia mapeador) pero mira [Valeroso] (https: // github .com/jnunemaker/plucky). Es una lang de consulta sobre MongoDB y tal vez puede obtener una sintaxis un poco más sucinta. –

Respuesta

0

Nope. Y creo que esta es la motivación:

En MongoMapper, las consultas en la base de datos siempre devuelven un objeto raíz. Permitir que las consultas devuelvan un documento incrustado sin su padre sería una ruptura con eso y complicaría muchas cosas (¿y si llamo a .parent dentro de ese documento incrustado?), Por lo que MongoMappers se equivoca por el lado de la simplicidad y no pretende que las cosas son algo que no son Los documentos incrustados se almacenan en una matriz dentro del documento raíz en MongoDB, por lo que MongoMapper le proporciona una matriz en Ruby.

Así que sus dos formas de hacerlo son las formas previstas de hacerlo.

Si necesita algún suger sintáctico, no debería ser demasiado difícil codificar. Puede extender Array o puede codificar un complemento para ampliarlo al proxy for embedded docs de MongoMapper.

-1

Usted puede hacer ya sea:

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).first.alerts.select{|u| u.name == params[:name]} 

o

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).alerts.select{|u| u.name == params[:name]}.first 
+0

Sí. No hay respuesta seleccionada y esta es de hecho la única manera de hacerlo. Además, si se trata de un documento incrustado, no debería haber muchas entradas según las mejores prácticas. –

+0

No sé por qué te quejas aquí? Actualmente solo hay 1 forma de hacer lo que el OP ha pedido y esto es todo. Si tienes un problema con él, ¿por qué no crear una nueva gema mongo o resolver algo de esto? Y sí, como dije, si tienes toneladas de elementos como alertas, no deberían estar integrados por las mejores prácticas. Pero el OP no solicitó mejores prácticas u opiniones, solo para responder su pregunta ... –

+0

Ahí agregué una nueva opción para hacer esto, ahora vete si no tienes nada que agregar ... –

Cuestiones relacionadas