8
votes

Alias ​​sur le terrain avec mongoïde et rails

C'est une pratique courante dans MongoDB d'utiliser des noms de clés courts pour économiser de l'espace. Par exemple, on peut vouloir utiliser "fn" au lieu de "Nom" First_Name "

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

En outre, quelqu'un connaît-il des projets d'échantillons open source qui utilisent Mongoid?

Merci!


0 commentaires

3 Réponses :


5
votes

Je n'ai jamais vu de courts noms de clés dans aucun projet de Mongodb, je ne dirais donc pas que c'est une pratique courante. Je ne pense pas que vous verriez une amélioration de la vitesse notable et cela compliquerait votre code inutilement. Les noms descriptifs sont bons si longtemps qu'ils ne sont pas aussi descriptifs que cela vous prend pour toujours.

Il y a beaucoup de projets open source mongodb. Juste faire une recherche sur github.

- Edit ci-dessous -

C'était une réponse assez appréciée. Écraser les méthodes de traitement ( https://github.com/ MONGOID / MONGOID / BLOB / MASTER / LIB / MONGOID / ATTRIBUES / TRAVAILS.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.


4 commentaires

Ce n'est pas une vitesse de rapidité, c'est un problème d'espace. Il y a une grande différence entre stocker "Nom" et "Fn" un milliard de fois (~ 10 Go vs ~ 2GB). Si vous exécutez sur le matériel de produits de base, l'espace est bon marché, mais si vous utilisez le matériel de qualité serveur, l'espace coûte cher. Voir: blog.boxedice.com/2010 / 10/23 / ...


La seule fois où je verrais la raccourcissement des noms de champs nécessaires est quand: 1) de petites valeurs, 2) très grand jeu de données, 3) Schéma très lâche (champs adhoc). Compte tenu de ces 3 cas, je conviens que l'écrasement des méthodes de traitement a du sens (comme répondit ci-dessous). Même alors vous devrez garder à l'esprit à l'esprit lorsque vous interrogez également, vous produisez donc un code assez compliqué. Par exemple, si j'ai un très grand jeu de données, de petites valeurs, mais mon schéma ne changera presque jamais (comme les statistiques de suivi), je choisirais probablement de PostgreSQL au lieu de MongoDB.


Assez sûr que les gens de 10gen (la société derrière MongoDb) sont en désaccord [1] avec l'opinion de Dave Rapin. Non seulement, comme @intelekshual mentionné, pouvez-vous réaliser des économies d'espaces de disque importantes, mais Mongo doit stocker votre ensemble de travail et vos index en mémoire. Les documents plus petits signifie que vous pouvez stocker plus en mémoire, sans oublier que les performances augmentent vos gains de code d'application en ne manipulant pas à gérer plus de documents de Mongo plus ballés [1]: Docs.Mongodb.org/Manual/faq/Developers/...


C'est une ancienne réponse, mais j'espère que cela efface la compréhension - la raison principale que vous souhaiteriez utiliser des noms de champs courts dans MongoDB consiste à éviter la limite de taille de document BSON de 16 Mo. Cependant, dans la pratique, cela peut ne pas être utile pour vous. C'est très spécifique au cas d'utilisation.



0
votes

Quelque chose comme ça devrait fonctionner dans votre fichier de classe. (Il n'a pas été testé dans tous les cas, en passant un hasch dans la création ou la mise à 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


1 commentaires

Mongoid 3 a construit une prise en charge de l'aliasing sur le terrain, de sorte que vous n'ayez pas à utiliser la méthode de la méthode de la méthode de Ruby-cache-destination de la méthode.



13
votes

Vous devez envisager d'utiliser

 field :fn, :as => :firstname


1 commentaires

L'idée est que votre code d'application appelle prénom et non fn . Mongoid vient de stocker le champ en interne à Mongo comme fn .