¿Mongoid o MongoMapper? [cerrado]

83

Probé MongoMapper y tiene funciones completas (ofrece casi todas las funciones de AR), pero no estaba muy contento con el rendimiento al usar grandes conjuntos de datos. ¿Alguien se ha comparado con Mongoid? ¿Alguna mejora de rendimiento?

PanosJee
fuente

Respuestas:

49

He usado MongoMapper por un tiempo, pero decidí migrar a MongoId. La razón son los problemas ocultos más la arrogancia hacia los usuarios. Tuve que saltar a través de aros para hacer que MongoMapper funcionara con Cucumber (lo logré al final) y poner un par de parches, incluso el proyecto era simple, pero no es el punto. Cuando intenté enviar una corrección de errores (debido a la incompatibilidad con ActiveRecord), aparentemente se enojaron porque encontré un problema y me empujaron. Mientras estaba probando, también encontré un error importante con la implementación de su consulta, mientras que sus pruebas se ajustaron de manera que las pruebas pasen. Después de mi experiencia anterior, no me atreví a enviarlo.

Tienen un número significativamente menor de solicitudes de extracción y envíos de errores / características que MongoId, es decir, la participación de la comunidad es mucho menor. ¿Misma experiencia que la mía?

No sé cuál tiene más funciones en este momento, pero no veo mucho futuro en MongoMapper. No me importa solucionar problemas y agregar funcionalidad yo mismo, pero sí me importan las situaciones en las que no solucionarían errores.

Aynat
fuente
¿Puedo preguntarle cuál fue el error principal en la implementación de la consulta? He usado mongomapper en un proyecto anterior, pero también fue mi primera exposición a mongo. Cualquier información sobre problemas específicos con mongomapper que tenga sería excelente. Gracias
Rojo
5
Cuando se obtiene first () sin clasificar, funciona como last () en su lugar (o viceversa). Pero la prueba unitaria está escrita de la forma en que especifica el orden, por lo que pasa. Puede que ya esté arreglado, pero ya no uso MongoMapper. Pero lo dudo, vi cómo se implementó y es un mal diseño.
Aynat
Hola, ¿puedes enviar un enlace para obtener información sobre cómo migrar sin problemas de mongo mapper a mongoid?
Chen Kinnrot
1
@Aynat No creo que se haya solucionado, pero lo intenté y me dio el mismo resultado
Viren
Gracias a Dios, vi que esta conversación estaba decidiendo usar mongomapper o mongoid en mi próximo gran proyecto. Guess Mongoid gana.
aliirz
39

He estado usando ambos durante las últimas dos semanas. Mongomapper tiene un mejor soporte para asociaciones relacionales (no integradas) y tiene un mayor soporte de terceros. Mongoid tiene un mejor soporte para consultas, mucha mejor documentación (MM tiene casi ninguna, aunque supuestamente se está trabajando en un sitio web), soporte para Rail 3 (y por lo tanto soporte para Devise) y una comunidad un poco más activa en Grupos de Google.

Terminé yendo con Mongoid.

Nader
fuente
27
Desde que escribí originalmente esta respuesta, Mongoid ha recibido mucho apoyo de terceros y la diferencia en las comunidades es aún mayor. En mi opinión, Mongoid es una opción más clara hoy. El rendimiento debería ser relativamente el mismo ya que ambos pasan por el controlador Ruby. Aunque debe tener cuidado con OM para no construir documentos horribles.
Nader
37

Diferencias

MongoMapper

  • Afirmó tener un mejor soporte para las asociaciones relacionales.
  • Se dice que es más extensible debido a su arquitectura de complementos.
  • Utiliza un DSL para realizar consultas.
  • Las asociaciones de varios a varios se actualizan solo unilateralmente en MongoMapper.
  • Soporte menos robusto para documentos incrustados. Actualiza todo el modelo incluso si solo se modifican algunos atributos.

Mongoide

  • Se sugiere que sea más rápido que MongoMapper por evidencia anecdótica.
  • Soporte más sólido para documentos incrustados, utilizando operaciones atómicas de MongoDB ($ set, $ push, $ pull, etc.) para actualizar documentos anidados en el lugar.
  • Admite asociaciones bidireccionales de varios a varios.
  • Utiliza una sintaxis encadenable similar a ARel para realizar consultas.

Similitudes

  • Tanto MongoMapper como Mongoid tienen sitios web con buena documentación. Durante mucho tiempo se afirmó que MongoMapper tenía mala documentación, pero su nuevo sitio web parece cerrar la brecha.
  • Ambos se pueden configurar a través de un archivo YAML, y ambos tienen un generador de rieles para ese archivo.
  • Ambos son totalmente compatibles con Rails 3.

Configuración

MongoMapper

defaults: &defaults
  host: 127.0.0.1
  port: 27017

development:
  database: database_name

Mongoide

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

Bibliotecas de terceros

Ambas partes han afirmado tener un mejor soporte de terceros. Github revela lo siguiente:

  • La búsqueda de "Mongoid" produce 12671 resultados.
  • La búsqueda de "MongoMapper" produce 4708 resultados.

En particular, Devise no es compatible con MongoMapper.

Comprometer actividad

Durante el último año, parece que Mongoid se ha mantenido y actualizado con más regularidad que MongoMapper.

MongoMapper

MongoMapper

Mongoide

Mongoide

user2398029
fuente
1
Mongoid actualmente admite mapas de identidad.
user2503775
9

Una diferencia que encontré es que update_attributeen MongoMapper parece escribir todo el documento, independientemente de los atributos que realmente cambiaron. En Mongoid, solo escribe los atributos modificados. Este puede ser un problema de rendimiento importante para registros grandes. Esto es particularmente cierto para documentos incrustados (aquí labels), p. Ej.

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

Activado save, MongoMapper guardará todo el profileregistro, pero MongoId usará el $setoperador con lógica posicional para actualizar solo la etiqueta que cambió.

Otro problema es seleccionar qué campos devolver. Ambos apoyan un onlycriterio, pero Mongoid también admite un withoutcriterio, que es compatible de forma nativa con Mongo.

Me parece que Mongoid es más "redondeado" y completo en su API, lo que probablemente explica que es una base de código más grande. También parece mejor documentado.

Wolfram Arnold
fuente
7

¿Instalaste mongo_ext? Creo que el rendimiento está más relacionado con el controlador que con el propio mapeador. Al mirar el registro de mongo, puedo ver sin la extensión, que el transer parece tener algunos retrasos.

También haga lo que recomiendan en el sitio monogdb, seleccione solo los campos que necesita.

Piotr Zolnierek
fuente
El controlador ruby ​​no es tan rápido, especialmente 1.8, ¡pero 1.9 solo aumenta el rendimiento! Me pregunto si mongoid está más optimizado o lo único que ofrece es un enfoque diferente para las consultas y otras cosas, por el momento mongomapper es casi una función completa que ofrece casi todo el azúcar AR
PanosJee
1
Nota para los que lean esto más de un año después: mongo_extya no es necesario y se ha incorporado a la mongogema básica .
tkrajcar
4

Hice algunas pruebas con MongoMapper la semana pasada, era estable pero encontré que la interfaz de consulta estaba un poco limitada (también parte de la lógica AR era peculiar), cambié a Mongoid hoy y se siente mucho mejor de usar, y más intuitivo si estás acostumbrado a AR.

Aún no hay conclusiones de velocidad, pero el cambio fue sencillo, también funciona con Rails 3.

mtkd
fuente
4

Si está usando Rails3, recomendaría Mongoid - también usa "incluir" en lugar de herencia "<" para persistir las clases - usar "incluir" es el mejor paradigma en Ruby para agregar persistencia. Mongoid funciona bien para mí con Devise.

Para mejorar el rendimiento, intente utilizar selectivamente el acceso de nivel inferior, por ejemplo, ciclomotor; he visto que esto es hasta 10 veces más rápido

Tilo
fuente
3

Usé ambos y están a punto de igualar en funcionalidad, pero mira sus estadísticas de código Mongoid vs MongoMapper

Parece que MongoMapper tiene una calidad de código mucho mejor (si hace lo mismo con menos).

Puede calcular estas estadísticas usted mismo, aquí está el analizador https://github.com/alexeypetrushin/code_stats

Alex Craft
fuente
12
Punto clave: 'si hace lo mismo con menos' ...
tkrajcar
10
Esto parece completamente infundado.
Jim Mitchener
14
Comparar la calidad del código de un proyecto a través del tamaño del código es como comparar la calidad de 2 coches midiendo el peso.
Patrizio Rullo
3
En realidad, comparar el peso de los automóviles es perfectamente válido: puede juzgar mucho: qué tan rápido es, cuánto consume gasolina, etc. Y, en realidad, tiene sentido desde el punto de vista científico, eche un vistazo a la "complejidad de Kolmogorov".
Alex Craft
1
Aún así, aunque algunos han mejorado considerablemente la velocidad de mongomapper ( coffeepowered.net/2013/07/29/… ), todavía se sabe y se acepta que el mongoide es más rápido.
Adit Saxena
3

Creo que Mongoid es mucho mejor en configuración y mapeo.

rodrigoalvesvieira
fuente
1
Yo también lo creo. Además de que se siente más cercano a NoSQL que a MongoMapper, te hace pensar más en términos de ActiveRecord y, por lo tanto, SQL. Otra ventaja es la gran documentación
PanosJee
¡Sí! ¡El sitio web de Mongoid es genial con documentación!
rodrigoalvesvieira
0

Esperaría que el rendimiento sea el mismo, la última vez que verifiqué que MongoMapper carecía de soporte para Rails 3, por lo que estoy considerando Mongoid por ahora.

Omar Qureshi
fuente
0

sudo gem install mongo_ext es clave para obtener rendimiento.

MongoDB supera a CouchDB en términos de velocidad bruta, aunque CDB tiene su propio conjunto de ventajas.

Punto de referencia: http://www.snailinaturtleneck.com/blog/?p=74

Isaac
fuente
Está hablando de mongoid x mongo_mapper, cuál es la gema rubí más rápida para acceder a mongo, no mongodb x couchdb.
Victor Rodrigues
8
Nota para los que lean esto más de un año después: mongo_extya no es necesario y se ha incorporado a la mongogema básica .
tkrajcar
0

Devise no era compatible con MongoMapper y yo también prefiero moverme al estilo Rails3. Así que cambié a mongoide.

dragón rojo
fuente
Creo que MM lo admite actualmente.
user2503775
0

Espero que los puntos a continuación agreguen valores a las respuestas anteriores.

1.Mongoid es completamente compatible con Rails 3 y usa ActiveModel en todas partes (validaciones, serialización, etc.), donde MongoMapper todavía se enfoca en Rails 2 y usa la gema validable para sus validaciones.

2. Mongoid admite y funciona oficialmente en Ruby 1.8.7, 1.9.1 y 1.9.2 head.

3.Mongoid admite documentos incrustados de manera más sólida, realizando las operaciones atómicas de MongoDB en cualquier área de la jerarquía internamente. ($ conjunto, $ empujar, $ tirar, etc.). Con MM, debe indicarle explícitamente que realice estas operaciones.

4.MongoMapper tiene un mejor soporte de asociación relacional y funciona así por defecto.

MongoMapper es más extensible, con una arquitectura de complementos que hace que sea bastante fácil para las personas extenderlo con sus propias bibliotecas. Mongoid no tiene esto.

6.MM admite mapas de identidad, Mongoid no.

7.MM tiene una comunidad más grande y probablemente más soporte para bibliotecas de terceros. Me volví loco con la documentación y rdoc.

8.Mongoid admite clústeres de replicación maestro / esclavo. (Escribe al maestro, round robin lee a los esclavos) MM no.

9.Mongoid tiene una API de criterios de estilo ARel extremadamente rica, MM utiliza buscadores de estilo AR2.

Pravin Mishra
fuente