2010-11-19 6 views
6

Il est de pratique courante dans MongoDB d'utiliser des noms de touches courts pour économiser de l'espace. Par exemple, on pourrait vouloir utiliser "fn" au lieu de "first_name"Alias ​​de champ avec Mongoid et Rails

Cependant dans votre application, vous êtes foutu si vous utilisez "fn" partout. C'est trop moche. Pour Rails en particulier, existe-t-il un moyen facile de spécifier un alias lors de la déclaration d'un champ dans Mongoid?

En outre, est-ce que quelqu'un connaît des exemples de projets Open Source utilisant Mongoid?

Merci!

Répondre

3

Je n'ai jamais vu de noms de touches courts dans des projets MongoDB, donc je ne dirais pas que c'est une pratique courante. Je ne pense pas que vous verriez une amélioration sensible de la vitesse et cela compliquerait inutilement votre code. Les noms descriptifs sont bons tant qu'ils ne sont pas si descriptifs qu'il vous faut pour toujours taper.

Il y a beaucoup de projets open source de MongoDB. Fais simplement une recherche sur github.

- modifier ci-dessous -

C'était une réponse assez opiniâtre. Remplacer les méthodes de traitement (https://github.com/mongoid/mongoid/blob/master/lib/mongoid/attributes/processing.rb) comme décrit dans d'autres réponses est plus approprié dans le scénario où vous devez avoir de petits noms de champs.

+5

Ce n'est pas un problème de vitesse, c'est un problème d'espace. Il y a une grande différence entre stocker "first_name" et "fn" un milliard de fois (~ 10GB vs ~ 2GB). Si vous utilisez du matériel de base, l'espace est bon marché, mais si vous utilisez du matériel de qualité serveur, l'espace est coûteux. Voir: http://blog.boxedice.com/2010/10/23/on-shortened-field-names-in-mongodb/ – Intelekshual

+0

La seule fois où je verrais des noms de champs raccourcis est quand: 1) Petites valeurs, 2) Très grand ensemble de données, 3) Schéma très lâche (champs adhoc). Compte tenu de ces trois cas, je suis d'accord que l'écrasement des méthodes de traitement a du sens (comme indiqué ci-dessous). Même dans ce cas, vous devrez le garder à l'esprit lors de l'interrogation, de sorte que vous produisez un code un peu plus compliqué. Par exemple, si j'ai un très grand ensemble de données, de petites valeurs, mais mon schéma ne changera presque jamais (comme les statistiques de suivi) alors j'opterais probablement pour postgresql au lieu de mongodb. –

+0

À peu près sûr que les gens de 10Gen (la compagnie derrière MongoDB) sont en désaccord [1] avec l'opinion de Dave Rapin. Non seulement, comme l'a mentionné @Intelekshual, pouvez-vous réaliser des économies d'espace disque significatives, mais Mongo a besoin de stocker votre jeu de travail et vos index en mémoire. Des documents plus petits signifient que vous pouvez stocker plus en mémoire, sans compter que la performance augmente le gain de votre code d'application en n'ayant pas à manipuler plus de documents mongo gonflés [1]: http://docs.mongodb.org/manual/faq/developers/# how-do-i-optimiser-stockage-utiliser-pour-petits-documents – xentek

0

Quelque chose comme ça devrait fonctionner dans votre fichier de classe. (Il n'a pas été testé dans tous les cas, juste passer un hachage en créer ou mettre à jour.)

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 a un support intégré pour l'alias de champ, donc vous n'avez pas besoin d'employer la méthode d'alias method-cache-destorying de ruby. – xentek

Questions connexes