jueves, 9 de julio de 2020

Conexion con bases de datos

Conexion con bases de datos

Conexion mediante MySQL

Es un modelo de base de datos relacional basado en tablas relacionadas y a su vez estas en registos llamadas filas formadas por campos y columnas que tienen la misma estructura.

 

MySql es un sistema de gestión de bases de datos de codigo abierto que se puede descargar de la pagina https://dev.mysql.com/downloads/installer/

 

Para ello seleccionamos el sistema operativo y seleccionaremos el instalador MySQL mysql-installer-community-8.0.18.0.msi o la ultima version que haya disponible donde instalaremos los elementos mas comunes para trabajar con nodeJS:

  • Servidor MySQL 
  • Conectores MySQL
  • MySQL Workbench
  • MySQL Shell


Instalacion de MySQL

Instalamos mysql en el sistema si no lo tenemos instalado y accedemos mediante:

mysql -u nombreUsuario –p

 

Creamos una nueva base de datos donde la vamos a llamar clientes:

create database clientes;

 

Miramos haber si efectivamente se ha creado:

show databases;

 

Usamos la base de datos de Clientes:

use clientes;

 

Creamos las siguiente tabla en nuestra base de datos:

CREATE TABLE IF NOT EXISTS clientes.usuario(dni Varchar(30) primary key not null, nombre Varchar(30), primerApellido Varchar(30), segundoApellido Varchar(30));

 

Instalamos el paquete:

npm install mysql

 

Vamos a usar el driver de mySql:

var mysql = require('mysql');

connection = mysql.createConnection({

    host: 'localhost',

    port: '3306',

    user: 'nombreUsuario',

    password: 'clave’

});

 

Creamos nuestro objeto usuario:

var Usuario = function(){

    this.dni='';

    this.nombre='';

    this.primerApellido='';

    this.segundoApellido='';

}

Usuario.prototype.setDni= function(dni){

    this.dni = dni;

}

Usuario.prototype.setNombre= function(nombre){

   this.nombre = nombre;

Usuario.prototype.setPrimerApellido= function(primerApellido){

     this.primerApellido = primerApellido;

}

Usuario.prototype.setSegundoApellido= function(segundoApellido){

    this.segundoApellido = segundoApellido;

}

 

Usuario.prototype.getDni= function(){

   return this.dni;

}

Usuario.prototype.getNombre= function(){

    return this.nombre;

}

Usuario.prototype.getPrimerApellido= function(){

    return this.primerApellido;

}

Usuario.prototype.getSegundoApellido= function(){

    return this.segundoApellido;

}

Usuario.prototype.getJSON = function(){

    return {

       dni:this.dni,

       nombre:this.nombre,

       primerApellido:this.primerApellido,

       segundoApellido:this.segundoApellido,

    }

}

module.exports = Usuario;

 

 

Sobre el objeto connection vamos vamos a realizar las siguientes funciones:

  • Insercion de registros
  • Lectura de registros
  • Eliminancion de registros
  • Actualizacion de registros

 

Insercion de registros

insertarTablaUsuario = function (dni, nombre, primerApellido, segundoApellido, connection, callback) {

 var sql = 'INSERT INTO clientes.usuario VALUES("' + dni + '","' + nombre + '","' + primerApellido +

    '","' + segundoApellido + '")';

  connection.query(sql,

    function (err, results, fields) {

      if (err) {

        callback(err,"Error de inserccion en la tabla usuario, la clave primaria ya existe");

      } else {

        callback(null,"Todo correcto en la inserccion de la tabla de usuario");

      }

    });

};

 

Lectura de registros

getUsuario = function(dni,connection,callback){

  var sql = 'SELECT dni,nombre,primerApellido,segundoApellido FROM clientes.usuario WHERE clientes.usuario.dni="' + dni + '"'; 

  connection.query(sql,

    function (err, results, fields) {

      if (err) {

        callback(err,"Imposible la conexion con la base de datos",null);

      } else {        

        if (!results) {

          callback(null, false,null);

        }

        else {

         //insertamos el dato en el objeto

        var usuarioJSON = [];

        for (i=0; i < results.length; i++){

            usuario = new Usuario();            

            var registro = results[i];

            usuario.setDni(registro.dni);

            usuario.setNombre(registro.nombre);

            usuario.setPrimerApellido(registro.primerApellido);           

            usuario.setSegundoApellido(registro.segundoApellido);         

            var usuarioJson = usuario.getJSON();

            usuarioJSON[i]= usuarioJson;      

        } 

          callback(null,false,usuarioJSON);

        }

      }

    });

}

 

Eliminacion de registros

borrarUsuario = function(dni,connection,callback){

  var sql ='DELETE FROM clientes.usuario WHERE dni = "' + dni + '"';     

  connection.query(sql,

        function (err, results, fields) {

         if (err) 

         {

           callback(err,"Error de Borrado en la tabla usuario");

         } else {

           callback(null,"Borrado correcto en la tabla usuario");

         }

        });

}


Modificación de registros

modificarUsuario = function (dni, nombre, primerApellido, segundoApellido, connection, callback) {

  var sql = 'update clientes.usuario set nombre ="' + nombre + '",' + ' primerApellido ="' + primerApellido + '",' +

  ' segundoApellido ="' + segundoApellido + '" WHERE dni = "'+  dni + '"';

  console.log(sql);

   connection.query(sql,

    function (err, results, fields) {

      if (err) {

        callback(err,"Error de modificacion en la tabla usuario");

      } else {

        callback(null,"Todo correcto en la modificacion de la tabla de usuario");

      }

    });

};

 


Conexion mendiante NodeJS:

 

MongoDB

Es un modelo de base de datos NoSQL que esta orientado a documentos y es un softawe de codigo abierto que guarda los documentos en formato BSON.


Instalacion de mongodb

Para la instalación vamos a la página de mongo:

https://www.mongodb.com/

Descargamos la ultima version para windows 10.

Agregamos a la variable de entorno path la ruta:

C:\Program Files\MongoDB\Server\4.2\bin

MongoDB necesita que creemos un directorio llamado data para los datos y las carpetas db y logs

·         \data\db

·         \data\logs

 

md \data\db

md \data\logs

 

Insertamos en el archivo de configuracion mongo.cfg:

auth = true

 

Establecemos la variable de entorno path:

 C:\Program Files\MongoDB\Server\4.2\bin

 

# mongod.conf

 

# for documentation of all options, see:

#   http://docs.mongodb.org/manual/reference/configuration-options/

 

# Where and how to store data.

storage:

  dbPath: C:\Program Files\MongoDB\Server\4.2\data

  journal:

    enabled: true

#  engine:

#  mmapv1:

#  wiredTiger:

 

# where to write logging data.

systemLog:

  destination: file

  logAppend: true

  path:  C:\Program Files\MongoDB\Server\4.2\log\mongod.log

 

# network interfaces

net:

  port: 27017

  bindIp: 127.0.0.1

 

 

#processManagement:

 

#security:

 

#operationProfiling:

 

#replication:

 

#sharding:

 

## Enterprise-Only Options:

 

#auditLog:

 

#snmp:

 

auth = true

 

Instalacion de Robo3T

Vamos a la pagina  https://robomongo.org/  y descargamos la herramienta Robo3T.

 

Iniciamos en una ventana cmd como administrador y ejecutamos mongod en la carpeta de para iniciar el servidor.

Tenemos varias opciones para los clientes de mongoDB:·        

  • mongo (desde la consola cmd, abriendo otra ventana cmd como administrador y ejecutado mongo).
  • Robo3T.
  • A traves de codigo mendiante NodeJS.

 

Si usamos mongo desde la consola cmd:

Usamos use miBaseDatos para crear nuestra base de datos:

use nombreBaseDatos

 

Para crear usuario en mongoDB:

db.createUser({

  user: "miUsuario",

  pwd: "miContraseña",

  roles: ["readWrite"]

})


Para ver las bases de datos creadas:

show dbs

Para ver las colecciones:

show collections

Con db.nombreColeccion.operaciónes para actuamos sobre nuestras colecciones:

Inserción en mongoDB:

db.usuarios.insert({dni:'1', nombre: 'javier', primerApellido: 'heras', segundoApellido: 'lopez'});

 

Lectura de documentos:

db.nombreBaseDatos.find(

   //Seleccion

   //Proyeccion

 )

 

Ejemplo buscamos aquellos usuarios con dni 23, que nos proyecten los campos dni, nombre, primerApellido y segundoApellido que ademas nos muestren 10 documentos:

db.usuarios.find(                 

  {dni: {$eq: "23"}},            // Seleccion

  {dni: 1, nombre: 1, primerApellido: 1 , segundoApellido: 1}  // projección

).limit(10);     

 

Borrado de documentos:

db.nombreBaseDatos.remove(

   //Seleccion

)

 

db.usuarios.remove(                 

  {dni: {$eq: "23"}}          

)

 

Modificacion de documentos:

db.nombreBaseDatos. update (

   //Seleccion

   //Modificacion

 )

 

 

db.usuarios.update(                             

  {dni: {$eq: "23"}},            

  { $set: {nombre: "Juan", primerApellido: "Garcia" , segundoApellido: "Lopez"}}      

)

 

A traves de codigo mendiante NodeJS:

Vamos a usar el paquete de mongoose donde podemos acceder a su pagina web para ver la documentacion en https://mongoosejs.com/docs/


Instalamos el paquete:

npm install mongoose

 

Vamos a usar el driver mongoose:

var mongoose = require('mongoose');

 

mongoose.connect('mongodb://javier:javier@localhost:27017/usuario', { useNewUrlParser: true }, function (err) {

 

        if (err) {

 

            console.log("Error de conexion: " + err);

 

            return callback(err);

 

        } else {

 

            console.log('Successfully connected');

 

        }

 

    });


Operaciones sobre los datos desde nodeJS

  • Inserción de documentos
  • Lectura de documentos
  • Eliminación de documentos
  • Actualización de documentos

 

 

Inserción de documentos

Creamos una colección de usuarios donde cada usuario tendra:

  • dni
  • nombre
  • primerApellido
  • segundoApellido

Vamos a crear el modelo para guardar los usuarios:

Modelo de usuario:

    1.  Descripcion:

En primer lugar creamos la descripcion de nuestro modelo donde definimos los atributos que tendra el documento:

  var descripcionUsuario = {

     dni: String,

     nombre : String,

     primerApellido : String,

     segundoApellido : String,

 }

 

    2. Esquema

 var esquema = mongoose.Schema;

 var schemaUsuario = esquema(descripcionUsuario);

3. Modelo

Con el método model(), crearemos un modelo con el nombre de la coleccion ‘usuario’, donde la base de datos le añadira una ‘s’ al final y despues le pasamos el esquema, sera la estructura del modelo.

var UsuarioData = mongoose.model('usuario’, schemaUsuario);

Creamos una instancia de UsuarioData:

var usuario = new UsuarioData();

 

Asignamos los datos:

usuario.dni =’23’

usuario.nombre =’Juan’

usuario.primerApellido=’Garcia’

usuario.segundoApellido=’Lopez’

 

Insertamos en la colección:

usuario.save(function(err){

if (err){

   callback(err)

}else{

   Callback(null,”Usuario Insertado Corretamente”);

}


Lectura de documentos

Usamos la siguiente instrucción:

db.collection.find(query, projection)

Hacemos cuatro tipos de lecturas:

  • Mediante la query con operaciones logicas y de comparacion
  • Mediante findById
  • Mediante la proyección
  • Mediante una ordenacion

 

Mediante la query con operaciones logicas y de comparación:

colección.findById(id, function(err,documento){

 

………………..

 

})

 

Donde id puede ser

  • Una cadena que mongoose se encargara de convertir al tipo ObjecId
  •  Un objeto ObjectId

 

leer = function(usuario){

  usuario.find({$or : [ {nombre :{'$eq': 'Juan'}},{ciudad :{'$eq': 'Pedro'}} ]},function(err,documentos){

    if (err){

      console.log("Ha ocurrido un error");

    }

    else {

      var numeroDocumentos = documentos.length;

      for (i=0; i < numeroDocumentos; i++){

        var documento = documentos[i];

        var dni = documento.dni;

        var nombre = documento.nombre;

        var primerApellido = documento.primerApellido;

        var segundoApellido = documento.segundoApellido; 

        console.log('Dni: ' + dni);

        console.log('Nombre: ' + nombre);

        console.log('PrimerApellido: ' + primerApellido);

        console.log('SegundoApellido: ' + segundoApellido);

        console.log('\n');

      }

    }

  });

}


var ObjectId = mongoose.Types.ObjecId;

var id new ObjectId(“5ea0640339886f428895278e”);

leer2 = function(Usuario){

  //ObjecId

  var ObjectId = mongoose.Types.ObjectId;

  var id = new ObjectId("5ea0640339886f428895278e");

  Usuario.findById(id,function(err,documento){

    if (err){

        console.log('Error de lectura');

    }else {

      var numeroDocumentos = documentos.length;

      for (i=0; i < numeroDocumentos; i++){

        var documento = documentos[i];

        var dni = documento.dni;

        var nombre = documento.nombre;

        var primerApellido = documento.primerApellido;

        var segundoApellido = documento.segundoApellido;

        console.log('Dni: ' + dni);

        console.log('Nombre: ' + nombre);

        console.log('PrimerApellido: ' + primerApellido);

        console.log('SegundoApellido: ' + segundoApellido);

        console.log('\n');

    }

  });

}


Mediante la proyección: 

leer3 = function(Usuario){

  //Sobre la coleccion mostramos el nombre y los apellidos

  Usuario.find({}, {nombre : 1, primerApellido: 1},function(err,documentos){

    var numeroDocumentos = documentos.length;

    for (i=0; i < numeroDocumentos; i++){

        var documento = documentos[i];

        var nombre = documento.nombre;

        var primerApellido = documento.primerApellido;

        console.log('Nombre: ' + nombre);

        console.log('PrimerApellido: ' + primerApellido);        

        console.log('\n');

 

    }

  });

}

 

Eliminación de documentos:  

Colección.remove({query},function(err){

……

})

 

borrado = function(Usuario){

  Usuario.remove({nombre :{'$eq': 'Juan'}},function(err){

    if (err){

      console.log("Ha habido un error");

    } else {

      console.log("El borrado ha sido realizado");

    }

  });

}

 

 

var ObjectId = mongoose.Types.ObjecId;

var id new ObjectId(“5ea0640339886f428895278e”);

colección.findByIdAndRemove(id, function(err){

….

}

 

Operación drop que elimina la colección de nuestra base de datos

 

drop = function(){

  var coleccion = mongoose.connection.collections.usuario;

  coleccion.drop(function(err){

    if (err){

      console.log("Ha habido un error");

    } else {

      console.log("El coleccion ha sido borrada");

    }

  }); 

}

 

Ordenación de documentos

colección.find({query},{proyecion},{ sort : {<campo> : <1 o -1>}}), function (err,docs){

      // Tratamos los documentos devueltos

});

 

  • 1 ordenacion ascendente
  • -1 ordenacion descendente

 

ordenar = function(Usuario){

  //Sobre la coleccion mostramos el nombre y los apellidos

  Usuario.find({}, {dni : 1, nombre: 1, primerApellido: 1, segundoApellido: 1},{sort : {nombre : 1} },function(err,documentos){

    var numeroDocumentos = documentos.length;

    for (i=0; i < numeroDocumentos; i++){

      var numeroDocumentos = documentos.length;

      for (i=0; i < numeroDocumentos; i++){

        var documento = documentos[i];

        var dni = documento.dni;

        var nombre = documento.nombre;

        var primerApellido = documento.primerApellido;

        var segundoApellido = documento.segundoApellido;   

        console.log('Dni: ' + dni);

        console.log('Nombre: ' + nombre);

        console.log('PrimerApellido: ' + primerApellido);

        console.log('SegundoApellido: ' + segundoApellido);

        console.log('\n');

    }

  });

}

 

Modificación de documentos

Colección.update({selección},{actualización},{multi: true },function(err){

……

})

La opcion {multi: true } es opcional nos indica la actualización simultanea de varios documentos.

 

modificación = function(Usuario){ 

 UsuarioData.update({dni :'02345348I'},{$set: {nombre : 'Pedro', primerApellido : 'Lopez'}},  function(err){

    if (err){

      console.log("Ha habido un error");

    } else {

      console.log("La actualización ha sido realizada correctamente");

    }

  });

}


El método updateOne () se usa para actualizar cada documento que coincida con el filtro.

Tiene tres parametros, query, actualizacion y una función de callback y su devolución tiene dos parametros el error si existe y el resultado.

Colección.updateOne({query},{actualizacion},function(err){

……

})

 

 

modificacion = function(Usuario){

 Usuario.updateOne(
    { nombre: "Juan" },
    { $set: { nombre: "Pedro" } },
    function(err, documentos) {
      if (err) {
        res.send(err);
      } else {
        res.send(documentos);
      }
    }
  );

}

 

 

El método updateMany () se usa para actualizar documentos que coincidan con el filtro.

 

Colección.updateMany({query},{actualizacion},function(err){

……

})


modificacion = function(Usuario){

 Usuario.updateMany(
    { nombre: "Juan" },
    { $set: { nombre: "Pedro" } },
    function(err, documentos) {
      if (err) {
        res.send(err);
      } else {
        res.send(documentos);
      }
    }
  );

}

El método replaceOne() se usa para reemplazar todo el documento que coincida con el filtro, a diferencia que updateOne () que solo permite actualizar campos y ademas se pueden agregar nuevos campos sin perder los anteriores.

Colección.replaceOne({query},{actualizacion},function(err){

……

})


modificacion = function(Usuario){

 Usuario.replaceOne(
    { nombre: "Juan" },
    { $set: { nombre: "Pedro" } },
    function(err, documentos) {
      if (err) {
        res.send(err);
      } else {
        res.send(documentos);
      }
    }
  );

}

 

 

Relacciones entre colecciones

Vamos a crear una relación entre dos colecciones de mongo, una llamada usuarios y otra llamada cuentasBancarias, donde cada usuario tendra una sola cuenta, y cada cuenta pertenecera a un usuario.

 

Se requiere que cada documento tipo cuenta posea una referencia en uno de sus campos a un documento tipo usuario.

 

Para ello debemos crear una referencia a usuario en cada campo del documento tipo cuenta.
Tenemos dos tipos de referencias:
 

Referencias manuales:

Son las que se usan colocando el valor de _id de un documento en el campo de otro documento. Luego, si se desea obtener el documento asociado al _id se debe realizar una segunda consulta a la base de datos usando la información de dicho valor.


Creamos la colección usuarios de la siguiente manera:

db.usuarios.insert([

{

    "dni" : "23",

    "nombre" : "javier",

    "primerApellido" : "heras",

    "segundoApellido" : "lopez"

},

{

    "dni" : "22",

    "nombre" : "Juan",

    "primerApellido" : "Garcia",

    "segundoApellido" : "Lopez"

}

{

    "dni" : "50",

    "nombre" : "Pedro",

    "primerApellido" : "garcia",

    "segundoApellido" : "Garcia"

}

]);

 

 

Buscamos los usuarios: 

 

db.usuarios.find({})

{ "_id" : ObjectId("5f0c9b14188faa43fccfa6c2"), "dni" : "23", "nombre" : "javier", "primerApellido" : "heras", "segundoApellido" : "lopez", "__v" : 0 },

{ "_id" : ObjectId("5f0db7be4117ef27a0f51b5d"), "dni" : "22", "nombre" : "Juan", "primerApellido" : "Garcia", "segundoApellido" : "Lopez", "__v" : 0 },

{ "_id" : ObjectId("5f0dbdca631f6a05d06675c6"), "dni" : "50", "nombre" : "Pedro", "primerApellido" : "garcia", "segundoApellido" : "Garcia", "__v" : 0 }

 

 

Mongo ha asignado los valores _id como tipo ObjectId  y lo hace automaticamente, pero tambien lo podemos hacer manualmente.

Ahora crearemos la colección cuentas donde introduciremos la relacion a mano:

var idJavier = ObjectId("5f0c9b14188faa43fccfa6c2")

var idJuan = ObjectId("5f0db7be4117ef27a0f51b5d")

var idPedro = ObjectId("5f0dbdca631f6a05d06675c6")   

db.cuentas.insert([

{

    "dni" : idJavier,

    "id" : "23",

    "saldo" : 200

},

{

     "dni": idJuan,

    "id" : "22",

    "saldo" : 400

},

{

    "dni": idPedro,

    "id" : "50",

    "saldo" : 235   

}

]);

 

db.cuentas.find()

 

{ "_id" : ObjectId("5f0dd65aa166ac5678925f0c"), "dni" : ObjectId("5f0c9b14188faa43fccfa6c2"), "id" : "23", "saldo" : 200 }

{ "_id" : ObjectId("5f0dd65aa166ac5678925f0d"), "dni" : ObjectId("5f0db7be4117ef27a0f51b5d"), "id" : "22", "saldo" : 400 }

{ "_id" : ObjectId("5f0dd65aa166ac5678925f0e"), "dni" : ObjectId("5f0dbdca631f6a05d06675c6"), "id" : "50", "saldo" : 235 }

 



var cursor = db.cuentas.find({"_id" : ObjectId("5f0dd65aa166ac5678925f0c")},{"_id":0, "dni": 1, "saldo": 1}); 

var cuentas = cursor.hasNext() ? cursor.next() : null;

if (cuentas) {
var id = cuentas.dni
}

db.usuarios.find({"_id": id})  { "_id" : ObjectId("5f0c9b14188faa43fccfa6c2"), "dni" : "23", "nombre" : "javier", "primerApellido" : "heras", "segundoApellido" : "lopez", "__v" : 0 }


En la consulta anterior hemos usado una query ({"_id" : ObjectId("5f0dd65aa166ac5678925f0c ")}) en el método find(), y como parámetro de projection {"_id":0, "dni": 1, "saldo": 1}).
En sql seria asi:

SELECT id FROM cuentas WHERE id = "5f0c9b14188faa43fccfa6c2"

 

 

Referencias DBRef:

Sirven para representar un documento, las referencias incluyen el nombre de la colección, el valor del campo _id del documento y opcionacionalmente se puede incluir el nombre de la base de datos a la que pertenece la colección.

 

Un documento DBRef  tiene el siguiente formato:

 

{"$ref": <value>, "$id": <value>, "$db": <value>}

Para usar una referencia tipo DBRef en nuestro caso lo podemos hacer de la siguiente manera:

db.cuentas.insert([

{

    "dni" : {"$ref": "usuarios", "$id": ObjectId("5f0c9b14188faa43fccfa6c2")},

    "id" : "23",

    "saldo" : 200

},

{

     "dni": {"$ref": "usuarios", "$id": ObjectId("5f0db7be4117ef27a0f51b5d")},

    "id" : "22",

    "saldo" : 400

},

{

    "dni": {"$ref": "usuarios", "$id": ObjectId("5f0dbdca631f6a05d06675c6")},

    "id" : "50",

    "saldo" : 235   

}

]);

 

 

Si realizamos una consulta a nuestra colección usuarios obtenemos lo siguiente:
db.usuarios.find({})
{ "_id" : ObjectId("5f0c9b14188faa43fccfa6c2"), "dni" : "23", "nombre" : "javier", "primerApellido" : "heras", "segundoApellido" : "lopez", "__v" : 0 }
{ "_id" : ObjectId("5f0db7be4117ef27a0f51b5d"), "dni" : "22", "nombre" : "Juan", "primerApellido" : "Garcia", "segundoApellido" : "Lopez", "__v" : 0 }
{ "_id" : ObjectId("5f0dbdca631f6a05d06675c6"), "dni" : "50", "nombre" : "Pedro", "primerApellido" : "garcia", "segundoApellido" : "Garcia", "__v" : 0 }

JOIN
Lo vamos a hacer mediante el metodo aggregate().
Ejemplo:

db.cuentas.aggregate([{$lookup: {from: "usuarios", localField: "dni", foreignField: "_id", as: "relacion"  }}]);
{ "_id" : ObjectId("5f0deb5ca166ac5678925f12"), "dni" : ObjectId("5f0c9b14188faa43fccfa6c2"), "id" : "23", "saldo" : 200, "relacion" : [ { "_id" : ObjectId("5f0c9b14188faa43fccfa6c2"), "dni" : "23", "nombre" : "javier", "primerApellido" : "heras", "segundoApellido" : "lopez", "__v" : 0 } ] }
{ "_id" : ObjectId("5f0deb5ca166ac5678925f13"), "dni" : ObjectId("5f0db7be4117ef27a0f51b5d"), "id" : "22", "saldo" : 400, "relacion" : [ { "_id" : ObjectId("5f0db7be4117ef27a0f51b5d"), "dni" : "22", "nombre" : "Juan", "primerApellido" : "Garcia", "segundoApellido" : "Lopez", "__v" : 0 } ] }
{ "_id" : ObjectId("5f0deb5ca166ac5678925f14"), "dni" : ObjectId("5f0dbdca631f6a05d06675c6"), "id" : "50", "saldo" : 235, "relacion" : [ { "_id" : ObjectId("5f0dbdca631f6a05d06675c6"), "dni" : "50", "nombre" : "Pedro", "primerApellido" : "garcia", "segundoApellido" : "Garcia", "__v" : 0 } ] }

 

Estamos diciendo a Mongo que busque los documentos en la colección usuarios cuyo _id coincida con el campo dni de cuentas y los agregue al documento devuelto en un campo nuevo campo llamado relación.

 

Por ejemplo si usamos mongoose en nodeJS:

DaoUsuario.prototype.getUsuarios = function (callback) {

    //Devolvemos una funcion de callback err,mensaje,resultados

    //Buscamos los usuarios de la coleccion usuarios

   this.usuarios = [];

   var sThis = this;

   UsuarioData.aggregate([{$lookup: {from: "cuentas", localField: "dni", foreignField: "dni", as: "relacion"  }}],function(err,documentos){

   if (err){

       console.log(err);

   }else {

      //insertamos los documentos en un array           

      for (i = 0; i < documentos.length; i++) {

        var documento = documentos[i];

        var dni = documento.dni;

        var nombre = documento.nombre;

        var primerApellido = documento.primerApellido;

        var segundoApellido = documento.segundoApellido;

        usuario = new Usuario();

        usuario.setDni(dni);

        usuario.setNombre(nombre);

        usuario.setPrimerApellido(primerApellido);

        usuario.setSegundoApellido(segundoApellido); 

        var cuenta=documento.relacion[0];

        var id = cuenta.id;

        var saldo = cuenta.saldo;

        var cuenta = new CuentaBancaria();

        cuenta.setId(id);

        cuenta.setSaldo(saldo);

        usuario.setCuenta(cuenta);

        sThis.usuarios.push(usuario);

      }

      callback(err,"La Busqueda fue correcta",sThis.usuarios);

   }

   });

}

 

Codigo de prueba de una base de datos usando mongoDB:
https://github.com/javierheras750/mongoDB
Codigo de prueba de una base de datos usando MySQL:
https://github.com/javierheras750/MySQL