Anteriormente escribí sobre fácilmente
desarrollo de aplicaciones Node.js y Couchbase con Ottoman para ODM. Ese post era sólo una muestra de lo que Ottoman puede hacer y de cómo usted
puede compararlo con las cosas que Mongoose puede hacer con MongoDB.
Esta vez vamos a ir un paso más allá y veremos algunos casos de uso que hacen brillar a Ottoman.
El SDK de Node.js para Couchbase tiene muchas formas diferentes de trabajar con documentos. Operaciones CRUD, consultas N1QL, Couchbase Views, estas
son cosas estupendas, pero ¿qué ocurre cuando los datos se vuelven realmente salvajes? Por salvaje me refiero a que tienes documentos con
relaciones y estructuras complejas. Podrías usar Couchbase Views y operaciones CRUD, pero si tus relaciones son complejas, estás
va a tener un montón de código Node.js para la manipulación de datos. Podrías usar consultas N1QL, pero con relaciones complejas vas a
para quedarte con enormes consultas complicadas con muchas uniones. ¿Qué hay que hacer?
Algunos ejemplos de modelización
Digamos que estamos trabajando con los siguientes modelos de documentos. Vamos a suponer que esta aplicación es algún tipo de gestión de proyectos
aplicación.
Un modelo de proyecto
Dado que estamos creando proyectos, no sólo necesitaremos información sobre el proyecto en sí, sino también sobre quién forma parte de él. Tomemos el
siguiendo como ejemplo el modelo otomano:
|
1 2 3 4 5 6 7 8 9 10 |
var ProyectoMdl = otomana.modelo("Proyecto, { nombre: "cadena", descripción: "cadena", propietario: { ref: "Usuario" }, usuarios: [ { ref: "Usuario" } ] }); |
En el modelo anterior, el propietario es un modelo otomano diferente llamado Usuariopero el usuarios es un
matriz de ese Usuario modelo.
Un modelo de usuario
Con el modelo de proyecto en su lugar tenemos que definir el modelo de usuario en Ottoman. Podría ser algo como esto:
|
1 2 3 4 5 6 7 8 9 |
var UserMdl = otomana.modelo("Usuario", { nombre: { primero: "cadena", último: "cadena" }, correo electrónico: "cadena" }); |
El modelo de usuario anterior es sólo una cadena de datos estándar. No hay referencias a otros modelos como vimos en el modelo de proyecto. Ahora
tienen que preocuparse de consultar estos dos modelos de la mejor manera.
Consulta profunda con otomana
Supongamos que queremos consultar los proyectos de nuestra aplicación. Esta consulta sería típicamente algo como esto:
|
1 2 3 4 5 6 7 8 |
ProyectoMdl.getById("ID_HERE", función(error, proyecto) { si(error) { devolver res.estado(400).enviar(error); } res.enviar(proyecto); }); |
Los resultados de esta consulta pueden ser parecidos a los siguientes:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ nombre: "Mi proyecto", descripción: "Esta es una descripción de mi proyecto", propietario: { "_tipo": "usuario", "$ref": "1234" }, usuarios: [ { "_tipo": "usuario", "$ref": "1234" }, { "_tipo": "usuario", "$ref": "4321" } ] } |
¿Qué está mal aquí? Bueno, la consulta sólo cargó una cantidad superficial de datos. Por ejemplo, ninguna de la información real del usuario cargado,
sólo las referencias a esos documentos de usuario.
¿Cómo podemos hacer una búsqueda profunda de los demás documentos? Echa un vistazo a esta revisión de nuestra consulta:
|
1 2 3 4 5 6 7 8 |
ProyectoMdl.getById("ID_HERE", {carga: ["usuarios"]}, función(error, proyecto) { si(error) { devolver res.estado(400).enviar(error); } res.enviar(proyecto); }); |
Obsérvese el uso de {carga: ["usuarios"]} en este caso. Esto significa que queremos cargar todos los modelos de usuario en el array
cuando ejecutamos nuestra consulta. ¿Y si quisiéramos cargar también los documentos del propietario? Haríamos algo como
{carga: ["usuarios", "propietario"]} para cargarlos también.
Complicar el modelo otomano
Ahora vamos a cambiar un poco nuestro modelo de datos. Digamos que el modelo de nuestro proyecto Ottoman ahora se ve así:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var ProyectoMdl = otomana.modelo("Proyecto, { nombre: "cadena", descripción: "cadena", propietario: { ref: "Usuario" }, comentarios: [ { mensaje: "cadena", usuario: { ref: "Usuario" } } ] }); |
En lugar de una matriz de modelos otomanos, ahora trabajamos con una matriz de objetos que contienen un modelo otomano.
Cambiar la consulta de nuestra otomana profunda
Con el cambio de nuestro modelo de datos viene un cambio en nuestra consulta. No tiene sentido hacer {carga: ["comentarios"]} porque
comentarios no es un modelo otomano. No hay nada que cargar. En su lugar tenemos que cambiar nuestra consulta para que se vea así:
|
1 2 3 4 5 6 7 8 |
ProyectoMdl.getById("ID_HERE", {carga: ["propietario", "comentarios[*].usuario"]}, función(error, proyecto) { si(error) { devolver res.estado(400).enviar(error); } res.enviar(proyecto); }); |
Obsérvese el uso de comentarios[*].usuario arriba. Estamos cargando el modelo de usuario que existe en todos los elementos del objeto
matriz.
Conclusión
Usted acaba de ver cómo cargar modelos hijo todo dentro de una sola consulta. Aunque es muy posible utilizando una consulta N1QL, tomaría unos cuantos
ÚNASE A para hacer el trabajo. Todo depende de sus preferencias, pero si le gusta el enfoque ODM, Ottoman
y el carga es una gran opción.
En la página compiance Proyecto GitHub como
así como en un serie de seminarios web que hice sobre desarrollo full stack.