javascript - principiantes - npm mongodb
mangosta vs mongodb(nodejs modules/extensions), ¿qué mejor? ¿y por qué? (4)
Estoy construyendo una nueva aplicación y diseñando ahora su estructura, aquí hay algunas ideas sobre por qué usar o no usar mangosta:
- Mongoose será más lento (para grandes aplicaciones)
- Mongoose es más difícil con consultas más complicadas
- Habrá situaciones en las que desee más velocidad y elija ir sin mangostas, luego tendrá la mitad de las consultas con mangosta y medio con o sin ella. Esa es una situación loca, una vez ...
- Mongoose te hará codificar más rápido con aplicaciones simples con estructura db simple
- Mangosta te hará leer mongodb docs y mongoose docs
- Con la mangosta, tu pila obtendrá una cosa más de la que depender y es una posibilidad más de estrellarse y reducirse a cenizas.
El controlador mongodb es un controlador sin formato, te comunicas directamente con mongodb. mangosta es la capa de abstracción. Obtiene E / S más fácil a DB mientras su estructura de DB es lo suficientemente simple.
La abstracción trae sus requisitos y debes seguirlos. Su aplicación será más lenta, comerá más RAM y será más complicada, pero si sabe cómo usarla, puede escribir más rápidamente objetos simples, guardarlos en la base de datos.
Sin mangosta tendrás una aplicación más rápida con conexión directa a mongodb. Nadie dice que no puedes escribir tus propios modelos para guardar cosas en db. Usted puede. Y creo que es más fácil. Usted escribe el código, que usará, ya sabe lo que necesita. Tu capa de abstracción será mucho más pequeña, luego la de mangosta.
Vengo del mundo PHP, allí teníamos sql en bruto con funciones mysql_ depreciadas, luego obtuvimos PDO - capa de abstracción orientada a objetos para comunicarnos con sql. O puede elegir un ORM pesado como Doctrine para tener cosas similares a la mangosta en mongoDB. Objetos con el método setter / getters / save y así sucesivamente. Está bien, pero al agregar más abstracción está agregando más archivos, más lógica, más documentación, más dependencias. Me gusta mantener las cosas simples y tener menos dependencias en mi stack. Por cierto, esa fue la razón por la que me mudé de PHP a Javascript servidor-cliente en primer lugar ...
Con mangosta, creo que es genial escribir algunas aplicaciones simples, que tengan una estructura db simple similar a sql . Cuando empiezas a tener subdocumentos y quieres hacer todas esas locas consultas, me parece muy difícil con la mangosta. Tienes que mirar los documentos de mongodb, luego mira los documentos de mangosta para descubrir cómo hacer la consulta que deseas. A veces encontrará que el futuro X de mongodb no está en la mangosta, por lo que desciende al controlador raw mongodb y escribe consultas mongodb en bruto en un lugar u otro. Sin mangosta, miras a mongodb docs y haces tu consulta.
Acabo de llegar a Node.js y veo que hay muchas librerías para usar con MongoDB, las más populares parecen ser estas dos: (mangosta y mongodb). ¿Puedo obtener ventajas y desventajas de esas extensiones? ¿Hay mejores alternativas a estos dos?
Editar: Encontré una nueva biblioteca que también parece interesante node-mongol y es "Mongolian DeadBeef es un asombroso controlador Mongo DB node.js que intenta acercarse mucho al shell mongodb". (readme.md)
https://github.com/marcello3d/node-mongolian
Esto es solo para agregar más recursos a las nuevas personas que lo ven así que, básicamente, el mongol es como un ODM ...
La mangosta es, de lejos, la más popular. Lo uso y no he usado otros. Entonces no puedo hablar sobre los demás, pero puedo contarte mis quejas con Mongoose.
- Documentación difícil / pobre
- Models son usados. Y ellos definen la estructura para sus documentos. Sin embargo, esto parece extraño para Mongo, donde una de sus ventajas es que puedes incluir una columna (¿equivocadamente, atributo?) O simplemente no agregar una.
- Los modelos distinguen entre mayúsculas y minúsculas. Yo y otros desarrolladores con los que trabajo han tenido problemas donde el caso del nombre de la colección con el que se define el modelo puede hacer que no se guarde nada, sin error. Hemos encontrado que usar todos los nombres en minúscula funciona mejor. Por ejemplo, en lugar de hacer algo como
mongooseInstace.model(''MyCollection'', { "_id": Number, "xyz": String })
es mejor hacerlo (aunque el nombre de la colección es realmenteMyCollection
):mongooseInstace.model(''mycollection'', { "_id": Number, "xyz": String })
Pero, sinceramente, es realmente útil. El mayor problema es la documentación. Está ahí, pero es seco y difícil encontrar lo que necesita. Podría usar mejores explicaciones y más ejemplos. Pero una vez que superas estas cosas, funciona realmente bien.
Mongoose es de nivel superior y usa el controlador MongoDB (es una dependencia, verifique el paquete.json), por lo que lo usará de cualquier forma, dadas esas opciones. La pregunta que debe hacerse es: "¿Quiero usar el controlador sin formato o necesito una herramienta de modelado de documentos de objeto?" Si está buscando una herramienta de modelado de objetos (ODM, una contraparte de ORMs del mundo SQL) para omitir algún trabajo de nivel inferior, quiere Mongoose.
Si desea un controlador, porque tiene la intención de romper muchas reglas que un ODM podría aplicar, vaya con MongoDB. Si desea un controlador rápido y puede vivir con algunas características que faltan, pruebe Mongolian DeadBeef: https://github.com/marcello3d/node-mongolian
Solo he usado mongodb. En mi opinión personal, recomendaría comenzar con algo de bajo nivel y luego subir de nivel. De lo contrario, es posible que se encuentre utilizando las características avanzadas adicionales proporcionadas por controladores de nivel superior como mangosta sin ningún beneficio real.
El problema que he tenido con mongodb, que es endémico de node.js, es la documentación deficiente. Hay documentación y mucha información, pero no siempre es la más útil. Que he visto hasta ahora no hay ejemplos buenos y completos de uso de producción del controlador. La documentación se completa con el mismo ejemplo de plantilla de abrir una conexión, emitir un comando y cerrar la conexión. Puede ver que es copiado y pegado de una plantilla porque cada ejemplo incluye todos los requisitos necesarios para todo lo que pueda ser necesario en lugar de solo lo que se necesita para cada ejemplo.
Para dar un ejemplo tomado completamente al azar:
- raw {Boolean, default: false}, realiza operaciones usando búferes sin formato bson.
¿Qué hace exactamente "realizar operaciones con búferes de bson sin formato"? No puedo encontrarlo explicado en ninguna parte y una búsqueda en Google para esa frase no ayuda. Quizás podría seguir buscando en Google, pero no debería hacerlo. La información debería estar allí. ¿Hay algún rendimiento, estabilidad, integridad, compatibilidad, portabilidad o ventajas funcionales para habilitar / deshabilitar esta opción? Realmente no tengo idea sin profundizar en el código y si estás en mi bote es un problema grave. Tengo un daemon donde no se requiere una persistencia perfecta, pero el programa necesita ser muy estable en tiempo de ejecución. Podría asumir que esto significa que espera que deserialice y serialice a JSON o que sea de bajo nivel, interno y transparente para el usuario, pero podría estar equivocado. Aunque tiendo a hacer buenas suposiciones, no puedo confiar en las suposiciones y las conjeturas al hacer sistemas vitales. Así que aquí puedo probar mi afirmación con código o profundizar mucho más en Google o su código. Por lo menos, esto no es tan malo, pero muchas veces me encuentro en esta situación al leer su documentación. La diferencia puede significar días pasados en una tarea contra horas. Necesito confirmación y la documentación apenas me da una explicación, y mucho menos una confirmación.
La documentación está apurada. No explica los eventos, da detalles vagos sobre cuándo se producen los errores o la naturaleza de esos errores y, a menudo, hay varias maneras de lograr la conectividad, lo que puede no ser claro. Puedes salir adelante y no es completamente inútil, pero es muy difícil en los bordes. Encontrará que algunas cosas se dejan adivinar y experimentar.