Hace unos meses, estaba hablando con algunos de los usuarios de nuestro cliente Node.js y escuché una opinión bastante estándar de que la gente estaba buscando algún método para simplificar su vida aún más cuando se utiliza Couchbase desde Node.js. Una cosa en particular que escuché mucho fue que estaban buscando alguna manera de tener modelos generados automáticamente para evitar tener que construir manualmente todo el boilerplate ellos mismos.
En respuesta a esto, empecé a trabajar en una nueva librería conocida como Ottoman. Ottoman es un ODM experimental diseñado alrededor de Couchbase. En este momento siento que Ottoman es lo suficientemente rica en características como para que algunos ojos externos empiecen a echarle un vistazo. Sé que hay bugs escondidos en el código fuente, y características que podrían ser mejoradas, ¡pero me gustaría contar con tu ayuda para hacerlo! Tú eres el que tiene la mejor idea de lo que quieres ver y lo que sería más beneficioso para TI, así que quiero saber de ti con todas las preguntas, comentarios y/o preocupaciones que puedas tener.
¡Adelante con algunas explicaciones!
La librería está pensada para permitirte construir una definición de cómo sería tu modelo, y luego auto-generar todo el boilerplate que normalmente va con esto. Como ejemplo, eche un vistazo a lo siguiente:
nombre de usuario: cadena,
nombre: cadena,
correo electrónico: cadena
}, {
cubo: nuevo couchbase.Conexión({})
});
Este ejemplo muestra cómo crear un modelo de usuario simple, que contiene 5 campos (sí 5, voy a explicar esto más adelante). Intuitivamente contiene 3 campos de cadena, que son nombre de usuario, nombre y correo electrónico. Además, hay 2 oculto que se añaden y que se pueden modificar. Estos campos son _type y _id, que contienen una cadena que indica qué modelo es este documento, así como una cadena de identificación única, que por defecto utiliza un UUIDv4 uuid.
Utilizar este modelo recién creado es extremadamente sencillo ya que el objeto de retorno de la función modelo es una función que puede utilizarse para instanciar nuevas instancias del modelo. Así que siguiendo el ejemplo anterior, podemos crear y guardar un nuevo usuario con lo siguiente:
prueba.nombre de usuario = 'brett19';
prueba.nombre = Brett Lawson;
prueba.correo electrónico = brett19@gmail.com;
Otomano.guardar(prueba, función(err) {
si (err) tirar err;
consola.registro("guardado);
});
Además, Ottoman permite cargar rápidamente un objeto almacenado previamente en la base de datos mediante findById, como en este caso:
si (err) tirar err;
consola.registro(obj.nombre);
// Brett Lawson
});
Hasta ahora, sólo hemos visto algunas operaciones simples de carga/almacenamiento que Ottoman puede hacer, vamos a profundizar un poco más y ver donde Ottoman realmente puede ayudar a aumentar nuestra productividad. Digamos ahora que estamos construyendo un blog, y necesitamos almacenar una entrada de blog asociada a los usuarios. Vamos a construir un modelo que nos permita hacer esto.
creador: Usuario,
título: cadena,
contenido: cadena
}, {
cubo: …
});
Puedes ver aquí que uno de nuestros tipos de campo en realidad se refiere a nuestro objeto Usuario creado anteriormente. Esto nos permite crear un nuevo BlogPost que hace referencia a otro documento almacenado en nuestra base de datos. También puede configurar un modelo para ser incrustado. Digamos que queremos almacenar la ubicación GPS actual del usuario, así como su ubicación GPS cuando hacen un post. Podríamos definir un modelo como este, y usarlo desde User y BlogPost, en lugar de ser un documento referenciado normal, los datos serán incrustados directamente en sus respectivos objetos, pero permanecerán como GPSPosition's cuando sean de-serializados.
lat: "número,
largo: "número
}, {
incrustar: verdadero
});
La última característica interesante que me gustaría mencionar hoy es la capacidad de generar automáticamente vistas map/reduce que permiten realizar búsquedas básicas para nuestros modelos. Me gustaría hacer hincapié en que esta función es muy experimental y sólo funciona para algunos de los casos de uso más comunes. Además, tiene la advertencia de que es necesario llamar manualmente a registroDesignDocs en el objeto Ottoman después de que se hayan registrado todos los modelos, ya que es la única forma de determinar los vínculos entre modelos. Además, regenerar estas vistas en cada inicio de la aplicación sería terriblemente ineficaz, por lo que normalmente lo hago como una especie de fase de preparación en este momento.
Para llevar nuestro ejemplo del blog aún más lejos, digamos que necesitamos una lista de las entradas de blog de nuestros usuarios. Normalmente esto implicaría construir manualmente una vista para extraer esta lista buscando todos los BlogPost en la referencia del creador para el usuario específico que estamos buscando. Con Ottoman esto es mucho más sencillo. Simplemente podemos definir una consulta en las propiedades de nuestro objeto Usuario de la siguiente manera:
misPosts: {
objetivo: BlogPost,
mappedBy: creador,
ordenar: desc,
límite: 5
}
},
Ahora puedes solicitar los posts realizados por un usuario simplemente invocando el método myPosts en cualquier instancia de Usuario y se te devolverá una lista de objetos BlogPost que fueron publicados por este usuario, la localización y deserialización de estos objetos se maneja automáticamente.
Hay un montón más de características soportadas por Ottoman que no tengo tiempo de mostrar hoy, pero si quieres ver más o quieres ayudar a hacer Ottoman aún mejor, dirígete a la página de GitHub aquí: https://github.com/couchbaselabs/node-ottoman/ !
Salud Brett
Brett,
Pasé tiempo buscando un modelo de objeto para Couch y me encontré con el NPM y ahora su entrada en el blog.
Tú [y los demás usuarios de Node.js] estáis de acuerdo en que esto es muy necesario.
Odio decirlo, pero Mongoose parece que ya lo tiene bien con los esquemas en términos de facilidad de uso y esto nos acerca un poco más al mundo Couch. Aunque no digo que Mongoose lo tenga todo bien ;)
El identificador y el tipo completamente transparentes/ocultos también son la mejor opción, en mi opinión (uno más que Mongoose aquí :)
Haré un fork del Github y jugaré un poco.
Salud,
-m
Hola Marc,
Hazme saber si tienes alguna pregunta sobre el código fuente, o sobre Ottoman en general. Hay un montón de características que todavía estoy trabajando en la documentación, además, el código fuente debe ser bastante sano para navegar a través excepto el código de consulta que todavía está siendo prototipo.
Saludos, Brett
buen trabajo! dirección correcta! Empecé a trabajar en un adaptador sailsjs (http://sailsjs.org/#!documenta.... Voy a comprobar otomana y sus conceptos
Hola Brett,
gracias por este trabajo y estoy totalmente de acuerdo con @disqus_gkZwtATXIN:disqus aquí que hay una brecha a Mongoose que sería genial si pudiéramos cerrar con Otomano. Estoy leyendo "Sams teach yourself Node.js in 24 hours\" y utilizan Mongoose en gran medida en su sección de ejemplo lo que me hace envidiar a los usuarios de MongoDB que tienen una manera fácil con todos.
Dicho esto, y por favor, perdóname como un aprendiz de Node.js y Noob, ya que estoy mucho en la prueba de mi primera aplicación en Node.js Actualmente estoy en un paso en el que estoy añadiendo datos de varias fuentes y me gustaría ver una función en Ottoman que está eliminando sólo un esquema específico (o en el lenguaje de Ottoman un modelo) con un simple comando.
No estoy seguro de si se entiende, pero lo que quiero es un borrón y cuenta nueva, ya que estoy probando cómo manejar múltiples entradas con el mismo ID y tener los datos actualmente dentro de la última ejecución arrojará un error en cada registro (no sólo en los que son realmente duplicados).
La comunidad Node.js en CouchBase es todavía muy pequeña, pero como podemos ver con el caso de Viber hay más y más empresas que ven "la luz" y se pasan.
¡Gracias por tu trabajo en esto, @brettlawson:disqus!
Hola Andreas,
¡Aprecio que te tomes el tiempo de difundir tus pensamientos aquí! Estoy de acuerdo en que hay algunas cosas que son más difíciles de completar con Couchbase, y estamos trabajando duro para tratar de cerrar esa brecha para los desarrolladores. Desafortunadamente no es trivial borrar todos los datos de un subconjunto particular de tus datos por el momento (aunque podríamos construir una vista que nos permitiera hacer esto). Sin embargo, para tu caso de uso, te sugiero que utilices el comando 'flush\' de la base de datos, que eliminará por completo los datos de un bucket en particular, o mejor aún, en el caso de ejecutar pruebas, tal vez utilizar el simulador de Node.js sea una mejor solución, es una poderosa herramienta para pruebas y es mucho más rápido que utilizar un clúster real.
Saludos, Brett
Gracias por tu ayuda @brettlawson:disqus y ya he implementado el FLUSH. He buscado Node.js mock y hay muchos diferentes. Como siempre es difícil identificar la mejor solución, ¿alguien prefiere una sobre las otras cuando se trata de "mocking"?
Hola Brett,
Un gran comienzo. En mis ojos - ODM es realmente el eslabón perdido en la pila Couch / Nodo y Mongoose está haciendo rápidamente Couch-uso VS Mongo-uso una opción cada vez menos atractivo.
¿Qué probabilidades hay de que este proyecto alcance el nivel de características y solidez de Mongoose? ¿Es un proyecto secundario o prioritario en CB?
Gracias CM
¡Hola CM!
Ottoman es en realidad ya muy completo, pero la mayoría de estas características no se han documentado hasta el momento. De hecho, se trata de un proyecto de primera línea, pero actualmente nos encontramos en un proceso de refactorización importante de nuestros clientes base, por lo que el desarrollo ha sido lento; además, aún no hemos conseguido que un número significativo de personas muestren interés en el proyecto. ¿Tiene alguna opinión sobre el proyecto?
Saludos, Brett
Como soy nuevo en Couchbase he estado cometiendo algunos errores al intentar
migrar un sistema de MongoDB a Couchbase, en particular con respecto a
el diseño de vistas/índices. Espero que alguien pueda ayudar.
Acabo de tropezar con esta página de la aplicación de entrenamiento couchbase. Tiene sentido añadir Ottoman. Líneas similares a las herramientas ORM en el mundo relacional - casi cada db nosql debería necesitarlo - http://www.fromdev.com/2012/07…
¿Qué planes tienen sobre la compatibilidad cruzada con nosql? O va a ser específica para couchbase solamente.
¿Se sigue manteniendo Ottoman? Si no, ¿cuál sería el mejor ODM para Couchbase en NodeJS?
Aquí hay otro odm de couchbase que puedes probar:
https://github.com/fogine/couc…
Hola Brett,
Soy nuevo en Couch Base y Ottoman, la razón para moverme a Couch Base fueron las vistas que soportan. Leí en los blogs que Ottoman soporta la interacción con las vistas en Couch base a través de la API, pero no fue capaz de encontrar la misma me puede ayudar dirigiéndome a alguna documentación en la que puedo leer y explorar el soporte de la API para la interacción de vista en Ottoman.
gracias
Gaurav
[...] Blog de la semana: Node.js ODM para Couchbase (Ottoman) [...]