J'ai essayé MongoMapper et il est complet (il offre presque toutes les fonctionnalités de l'AR) mais je n'étais pas très satisfait des performances lors de l'utilisation de grands ensembles de données. Quelqu'un a-t-il comparé avec Mongoid ? Des gains de performance ?
Réponses
Trop de publicités?J'ai utilisé MongoMapper pendant un certain temps mais j'ai décidé de migrer vers MongoId. La raison en est les problèmes cachés et l'arrogance envers les utilisateurs. J'ai dû sauter à travers des cerceaux pour faire fonctionner MongoMapper avec Cucumber (j'ai réussi à la fin) et mettre quelques patches même si le projet était simple, mais ce n'est pas le sujet. Lorsque j'ai essayé de soumettre un correctif de bogue (en raison de l'incompatibilité avec ActiveRecord), le fait que j'aie trouvé un problème et que j'aie été bousculé les a apparemment énervé. Pendant que je testais, j'ai également rencontré un bogue majeur dans l'implémentation de leur requête, alors que leurs tests étaient réglés de manière à ce que les tests passent. Après mon expérience précédente, je n'ai pas osé le soumettre.
Le nombre de demandes de téléchargement et de soumissions de bogues et de fonctionnalités est nettement inférieur à celui de 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 lequel a le plus de fonctionnalités à l'heure actuelle, mais je ne vois pas beaucoup d'avenir à MongoMapper. Cela ne me dérange pas de corriger les problèmes et d'ajouter des fonctionnalités moi-même, mais cela me dérange qu'ils ne corrigent pas les bogues.
J'ai utilisé les deux depuis deux semaines. Mongomapper prend mieux en charge les associations relationnelles (non intégrées) et offre un meilleur support des tiers. Mongoid dispose d'un meilleur support pour les requêtes, d'une bien meilleure documentation (MM n'en a pratiquement pas, bien qu'un site web soit censé être en cours de réalisation), du support Rail 3 (et donc du support Devise) et d'une communauté légèrement plus active sur Google Groups.
J'ai fini par choisir Mongoid.
Différences
MongoMapper
- Prétend avoir un meilleur support pour les associations relationnelles.
- Prétendument plus extensible grâce à son architecture de plugins.
- Utilise un DSL pour l'interrogation.
- Les associations Many-to-Many ne sont mises à jour que d'un seul côté dans MongoMapper.
- Support moins robuste pour les documents incorporés. Met à jour l'ensemble du modèle même si seuls quelques attributs sont modifiés.
Mongoïde
- Suggéré pour être plus rapide que MongoMapper par des preuves anecdotiques.
- Prise en charge plus robuste des documents intégrés, utilisant les opérations atomiques de MongoDB ($set, $push, $pull, etc.) pour mettre à jour les documents imbriqués sur place.
- Prend en charge les associations bidirectionnelles de plusieurs à plusieurs.
- Utilise une syntaxe chaînable de type ARel pour les requêtes.
Similitudes
- Les deux sites MongoMapper y Mongoïde ont des sites web avec une bonne documentation. MongoMapper a longtemps été considéré comme ayant une mauvaise documentation, mais son nouveau site Web semble combler le fossé.
- Les deux peuvent être configurés par le biais d'un fichier YAML, et les deux ont un générateur de 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
Mongoïde
development:
sessions:
default:
database: database_name
hosts:
- 127.0.0.1:27017
Bibliothèques tierces
Les deux parties ont affirmé avoir un meilleur soutien de la part des 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 prend pas en charge MongoMapper.
Activité d'engagement
Au cours de l'année écoulée, il semble que Mongoid ait été plus régulièrement maintenu et mis à jour que MongoMapper.
MongoMapper
Mongoïde
Une différence que j'ai trouvée est que update_attribute
dans MongoMapper semble écrire le document entier, sans tenir compte des attributs réellement modifiés. Dans Mongoid, il n'écrit que les attributs modifiés. Cela peut poser un problème de performance important pour les enregistrements volumineux. Cela est particulièrement vrai pour les documents intégré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 sauvegardera l'ensemble de la base de données. profile
mais MongoId utilisera l'enregistrement $set
avec une logique positionnelle pour ne mettre à jour que l'étiquette qui a changé.
Un autre problème consiste à sélectionner les champs à retourner. Tous deux supportent un only
mais Mongoid prend également en charge un critère without
qui est supporté nativement par Mongo.
Il me semble que Mongoid est tout simplement plus "rond" et plus complet dans son API, ce qui explique probablement que sa base de code soit plus importante. Il semble également mieux documenté.
Avez-vous installé mongo_ext ? Je pense que les performances sont plus liées au pilote qu'au mappeur lui-même. En regardant le log mongo, je peux voir que sans l'extension, le transiteur semble avoir quelques décalages.
Faites également comme ils le recommandent sur le site monogdb, ne sélectionnez que les champs dont vous avez besoin.