web-dev-qa-db-fra.com

Mongoid ou MongoMapper?

J'ai essayé MongoMapper et ses fonctionnalités sont complètes (offrant presque toutes les fonctionnalités AR), mais je n'étais pas très satisfait des performances lors de l'utilisation de grands ensembles de données. Quelqu'un at-il comparé à Mongoid? Des gains de performance?

83
PanosJee

J'ai utilisé MongoMapper pendant un certain temps, mais j'ai décidé de migrer vers MongoId. La raison en est des problèmes cachés plus l'arrogance envers les utilisateurs. J'ai dû franchir des étapes pour que MongoMapper fonctionne avec Cucumber (réussi à la fin) et mettre quelques correctifs même si le projet était simple, mais ce n'est pas le but. Lorsque j'ai essayé de soumettre un correctif de bogue (en raison d'une incompatibilité avec ActiveRecord), ils se sont apparemment sentis énervés que j'ai trouvé un problème et que je sois tombé. Lors de mes tests, j'ai également rencontré un bug majeur lors de l'implémentation de leur requête, alors que leurs tests étaient réglés de manière à ce que les tests réussissent. Après mon expérience précédente, n'a pas osé le soumettre. 

Ils ont un nombre de demandes d'extraction et de soumissions de bogues/fonctionnalités bien inférieur à MongoId, ce qui signifie que la participation de la communauté est beaucoup plus faible. Même expérience que la mienne? 

Je ne sais pas laquelle a plus de fonctionnalités pour le moment, mais je ne vois pas beaucoup d’avenir dans MongoMapper. Cela ne me dérange pas de résoudre les problèmes et d’ajouter des fonctionnalités moi-même, mais cela ne me dérange pas dans les cas où ils ne corrigeraient pas les bogues. 

48
Aynat

j'utilise les deux depuis deux semaines. Mongomapper prend mieux en charge les associations relationnelles (non intégrées) et dispose d’un support plus important pour les tiers. Mongoid supporte mieux les requêtes, la documentation est bien meilleure (MM n’en a pratiquement pas, bien qu’un site Web soit censé être en cours de réalisation), le support Rail 3 (et donc le support Devise) et une communauté légèrement plus active sur Google Groupes.

J'ai fini par aller avec Mongoid.

39
Nader

Différences

MongoMapper

  • A prétendu avoir un meilleur support pour les associations relationnelles.
  • Réclamé plus extensible à cause de son architecture de plugin.
  • Utilise un DSL pour interroger.
  • Les associations plusieurs à plusieurs ne sont mises à jour que d'un seul côté dans MongoMapper.
  • Prise en charge moins robuste des documents incorporés. Met à jour le modèle entier, même si seuls quelques attributs sont modifiés.

_ {Mongoid} _

  • Il est suggéré d’être plus rapide que MongoMapper grâce à des preuves anecdotiques.
  • Prise en charge plus robuste des documents incorporés, utilisant les opérations atomiques MongoDB ($ set, $ Push, $ pull, etc.) pour mettre à jour les documents imbriqués en place.
  • Prend en charge les associations bidirectionnelles plusieurs à plusieurs.
  • Utilise une syntaxe chaînable de type ARel pour les requêtes.

Similitudes

  • Les deux MongoMapper et Mongoid ont des sites Web avec une bonne documentation. MongoMapper a longtemps prétendu avoir une mauvaise documentation, mais son nouveau site Web semble combler l’écart.
  • Les deux peuvent être configurés via un fichier YAML, et tous deux ont un générateur Rails pour ce fichier.
  • Les deux sont entièrement compatibles avec Rails 3.

Configuration

MongoMapper

defaults: &defaults
  Host: 127.0.0.1
  port: 27017

development:
  database: database_name

_ {Mongoid} _

development:
  sessions:
    default:
      database: database_name
      hosts:
        - 127.0.0.1:27017

Bibliothèques tierces

Les deux parties ont prétendu avoir un meilleur soutien en tant que tiers Github révèle ce qui suit:

  • La recherche de "Mongoid" donne 12671 résultats.
  • La recherche de "MongoMapper" donne 4708 résultats.

Notamment, Devise ne supporte pas MongoMapper.

Activité de validation

Au cours de la dernière année, il semble que Mongoid ait été mis à jour et mis à jour plus régulièrement que MongoMapper.

MongoMapper

MongoMapper

Mongoïde

Mongoid

37
user2398029

Une différence que j'ai trouvée est que update_attribute dans MongoMapper semble écrire tout le document, quels que soient les attributs réellement modifiés. Dans Mongoid, seuls les attributs modifiés sont écrits. Cela peut constituer un problème de performances important pour les enregistrements volumineux. Cela est particulièrement vrai pour les documents incorporés (ici labels), par exemple.

profile = Profile.find(params[:id])
label = profile.labels.find_or_create_by(idx: params[:idx])
# MongoMapper doesn't have find_or_create_by for embedded docs
# -- you'll have to write custom code
profile.save

Sur save, MongoMapper enregistre l'intégralité de l'enregistrement profile, mais MongoId utilise l'opérateur $set avec la logique de position pour mettre à jour uniquement l'étiquette modifiée.

Un autre problème consiste à sélectionner les champs à retourner. Les deux prennent en charge un critère only, mais Mongoid prend également en charge un critère without, qui est pris en charge de manière native par Mongo.

Il me semble que Mongoid est simplement plus "arrondi" et complet dans son API, ce qui explique probablement que c'est une base de code plus grande. Il semble également mieux documenté.

9
Wolfram Arnold

Avez-vous installé mongo_ext? Je pense que la performance est davantage liée au pilote qu’au mappeur lui-même. En regardant le journal du mongo, je peux voir sans extension que le transeur semble avoir quelques retards.

Faites également ce qu'ils recommandent sur le site monogdb, sélectionnez uniquement les champs dont vous avez besoin.

7
Piotr Zolnierek

J'ai fait quelques tests avec MongoMapper la semaine dernière. Ils étaient stables mais je trouvais l'interface de requête un peu limitée (une partie de la logique de l'AR était bizarre), je suis passée à Mongoid aujourd'hui et je me sens beaucoup mieux d'utiliser - et plus intuitive si vous êtes habitué à AR.

Aucune conclusion sur la vitesse pour le moment - mais le basculement s'est fait sans douleur - cela fonctionne aussi avec Rails 3.

4
mtkd

Si vous utilisez Rails3, je recommanderais Mongoid - il utilise également "include" au lieu de l'héritage "<" pour les classes persistantes - utiliser "include" est le meilleur paradigme de Ruby pour ajouter de la persistance . Mongoid fonctionne très bien pour moi avec Devise.

Pour améliorer les performances, essayez d’utiliser sélectivement l’accès de niveau inférieur, par exemple. Vélomoteur - J'ai vu cela être jusqu'à 10 fois plus rapide 

4
Tilo

Je les ai utilisés tous les deux et ils sont sur le point de fonctionner de manière égale, mais regardez ses statistiques de code Mongoid vs MongoMapper

Il semble que MongoMapper ait une bien meilleure qualité de code (s’il fait la même chose avec moins).

Vous pouvez calculer ces statistiques par vous-même, voici l'analyseur https://github.com/alexeypetrushin/code_stats

3
Alexey Petrushin

Je pense que Mongoid est bien meilleur en configuration et en mapping.

3
rodrigoalves

Devise ne supportait pas MongoMapper, et moi aussi je préfère passer à la manière Rails3 Alors je suis passé à la mongoïde.

0
reddragon

Mongoid supporte pleinement Rails3 et possède une fonction de carte d'identité. 

Plus de document est à http://mongoid.org

Voir la performance ici http://mongoid.org/performance.html

0
arunagw

Sudo gem install mongo_ext est la clé pour obtenir des performances. 

MongoDB épate CouchDB en termes de vitesse brute - bien que CDB ait ses propres avantages. 

Indice de référence: http://www.snailinaturtleneck.com/blog/?p=74

0
Isaac

J'espère que les points ci-dessous ajoutent des valeurs aux réponses ci-dessus.

1.Mongoid est totalement compatible avec Rails 3 et utilise ActiveModel all Partout (validations, sérialisation, etc.), où MongoMapper est toujours concentré sur Rails 2 et utilise la gem pouvant être validée pour ses validations.

2.Mongoid prend officiellement en charge et fonctionne sur les têtes Ruby 1.8.7, 1.9.1 et 1.9.2.

3.Mongoid prend en charge les documents incorporés de manière plus robuste, en effectuant les opérations atomiques MongoDB sur toute zone de la hiérarchie en interne. ($ set, $ push, $ pull, etc.). Avec MM, vous devez lui indiquer explicitement d’effectuer ces opérations.

4.MongoMapper a un meilleur support d'association relationnelle et fonctionne comme ceci par défaut.

5.MongoMapper est plus extensible, avec une architecture de plug-in qui permet aux gens de l'étendre facilement avec leurs propres bibliothèques. Mongoid n'a pas cela.

6.MM prend en charge les cartes d’identité, pas Mongoid.

7.MM a une communauté plus large et probablement plus de soutien de bibliothèques tierces. Je suis devenu fou de documentation et de rdoc.

8.Mongoid prend en charge les clusters de réplication maître/esclave. (Écrit sur maître, tour à tour lit sur esclaves) MM ne le fait pas.

9.Mongoid possède une API de critères de style ARel extrêmement riche, MM utilise les détecteurs de style AR2.

0
Pravin Mishra

Je m'attendais à des performances identiques, la dernière fois que j'ai vérifié que MongoMapper ne disposait pas du support Rails 3, je regarde donc Mongoid pour le moment.

0
Omar Qureshi