2010-11-19 15 views
6

En MongoDB es una práctica común usar nombres de teclas cortas para ahorrar espacio. Por ejemplo, uno podría querer usar "fn" en lugar de "first_name"Alias ​​de campo con Mongoid y Rails

Sin embargo, en tu aplicación, estás jodido si usas "fn" por todas partes. Es muy feo Para Rails específicamente, ¿hay alguna manera fácil de especificar un alias al declarar un campo en Mongoid?

Además, ¿alguien sabe de algún proyecto de ejemplo de código abierto que utiliza Mongoid?

Gracias!

Respuesta

3

Nunca he visto nombres de teclas cortas en ningún proyecto de MongoDB, así que no diría que es una práctica común. No creo que veas una mejora de velocidad notable y complicaría tu código innecesariamente. Los nombres descriptivos son buenos siempre y cuando no sean tan descriptivos que te lleve siempre escribir.

Hay muchos proyectos de código abierto MongoDB. Solo haz una búsqueda en github.

- Editar A continuación -

Esta fue una respuesta bastante obstinado. Sobrescribir los métodos de procesamiento (https://github.com/mongoid/mongoid/blob/master/lib/mongoid/attributes/processing.rb) como se describe en otras respuestas es más apropiado en el escenario donde DEBE tener nombres de campo pequeños.

+5

No es un problema de velocidad, es un problema de espacio. Hay una gran diferencia entre almacenar "first_name" y "fn" mil millones de veces (~ 10GB vs ~ 2GB). Si está ejecutando hardware básico, el espacio es barato, pero si está ejecutando hardware de servidor, el espacio es caro. Ver: http://blog.boxedice.com/2010/10/23/on-schickenned-field-names-in-mongodb/ – Intelekshual

+0

La única vez que vería acortar los nombres de campo necesarios es cuando: 1) Valores pequeños, 2) Conjunto de datos muy grande, 3) Esquema muy flexible (campos adhoc). Dados esos 3 casos, estoy de acuerdo en que sobrescribir los métodos de procesamiento tiene sentido (como se explica a continuación). Incluso entonces tendrá que tenerlo en cuenta cuando realice consultas, por lo que está produciendo un código bastante más complicado. Por ejemplo, si tengo un conjunto de datos realmente grande, valores pequeños, pero mi esquema casi nunca cambiará (como las estadísticas de seguimiento), entonces probablemente optaría por postgresql en lugar de mongodb. –

+0

Bastante seguro que la gente de 10Gen (la compañía detrás de MongoDB) está en desacuerdo [1] con la opinión de Dave Rapin. No solo, como se mencionó en @Intelekshual, puede obtener importantes ahorros de espacio en disco, pero Mongo necesita almacenar su conjunto de trabajo y sus índices en la memoria. Documentos más pequeños significa que puede almacenar más en la memoria, sin mencionar que el rendimiento aumenta las ganancias de su código de la aplicación al no tener que manejar documentos de mongo más inflados [1]: http://docs.mongodb.org/manual/faq/developers/# how-do-i-optimize-storage-use-for-small-documents – xentek

0

Algo como esto debería funcionar en su archivo de clase. (No ha sido probado en todos los casos, simplemente pasando un hash en crear o actualizar.)

field :fn, :type => String 

    alias :first_name :fn 
    alias :filtered_process :process 

    def process(attrs = nil) 
    attrs[:fn] = attrs[:first_name] unless attrs.nil? 
    filtered_process(attrs) 
    end 
+0

Mongoid 3 tiene soporte incorporado para el aliasing de campo, por lo que no tiene que emplear el método de alias método-cache-destoring de ruby. – xentek

Cuestiones relacionadas