Skip to content

Latest commit

 

History

History
388 lines (292 loc) · 14.9 KB

File metadata and controls

388 lines (292 loc) · 14.9 KB

shieldsIO shieldsIO shieldsIO

WideImg

Máster en Programación FullStack con JavaScript y Node.js

JS, Node.js, Frontend, Backend, Firebase, Express, Patrones, HTML5_APIs, Asincronía, Websockets, Testing

Clase 81

MongoDB

logo

Licencias

MongoDB offers both an Enterprise and Community version of its powerful non-relational database. MongoDB Enterprise is available as part of the MongoDB Enterprise Advanced subscription, which features the most comprehensive support for MongoDB and the best SLA, in addition to Ops Manager, Compass, and the Connector for BI. MongoDB

Detalles

Claves

  • Flexibilidad gracias a los esquemas
  • Olvidate de las relaciones entre elementos de una manera clasica
  • Esta pensado desde Nodejs y para Nodejs
  • Postgres y SQL estan mas maduras y avanzadas, pero para muchos proyectos mongoDB puede ser ideal
  • El modelo de licencia y precio es necesario analizarlo
  • MongoDB esta mayormente escrito en C++, JS, python...
  • Es muy facil implementarlo para aplicaciones sencillas
  • Es muy flexible y puede evolucionar bien con herramienta grande como un CMS
  • Las migraciones por cambios en el esquema son extremadamente sencillas
  • No tienes que pensar mucho en los esquemas/arquitecturas
  • No esta pensado para analiticas/big data
  • Funciona muy bien para CMS/Ecommerces...
  • Mongodb puede funcionar sin esquemas, pero no es recomendado. No quieres perder la consistencia
  • Necesitas un driver para conectar Nodejs a la base de datos
  • Mongodb tiene su propio protocolo mongodb://, por lo general 27017 es el puerto por defecto
  • Tener esquemas no hace que sea reacional, solo que mantengas la consistencia
  • Por cada documento que almacenes en la base de datos se crea un _id basada en una conversión del objeto
  • No es una solución adecuada para aplicaciones con transacciones complejas

MongoDB Enterprise

  • In-memory Storage Engine
  • Encrypted Storage Engine (Encriptación)
  • Advanced Security (LDAP, Kerbero, auditoria...)

Recursos

MongoDB: Instalación

MongoDB Community Edition

MongoDB Enterprise

MongoDB: shell and GUI

Lanzar la shell

# Debes tener Mongo lanzado, recomendado hacer un demonio 
mongod

# Debes poder acceder desde otra terminal
mongo

Comandos útiles

  • show dbs Muestra las bases de datos actuales
  • use <nombre-db> Cambia a la base de datos
  • show collections Muestra las coleciones en esa base de datos
  • db.help() Muesta la ayuda para ver todos los comandos
  • db.createCollection('<nombre-collection>') Genera una nueva colección

MongoDB Compass (Community Edition)

logo

MongoDB: Diferencias con SQL

logo

Resumen rápido

logo

Nueva forma de trabajar

logo

Asociaciones

logo

Recursos

Mongoose

logo

Claves

  • Es un ORM
  • Las queries de Mongoose no son promosesas y es necesario usar exec(), detalles

Relación de Mongoose con MongoDB

logo

Relación Mongoose con Express

logo

Instalar Mongoose

$ npm install mongoose

conectar con la base de datos

Con Promesas

const connect = () => {
   return  mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
}

connect()
    .then(data => console.log("CONNECTED--->", data))
    .catch(err => console.warn("ERROR!--->", err))

Con eventos

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
  // we're connected!
});

Crear un esquema

const kittySchema = new mongoose.Schema({
  name: String
});

Crear un modelo

  • Los modelos estan siempre en minusculas y se encargan automaticamente e generar las colecciones añadiendo una s al nombre de modelo. Asi Modelo film será la colección films
const Kitten = mongoose.model('Kitten', kittySchema);

const silence = new Kitten({ name: 'Silence' });
console.log(silence.name); // 'Silence'

Añadir métodos a los documentos

kittySchema.methods.speak = function () {
  const greeting = this.name
    ? `Meow name is ${this.name}`
    : "I don't have a name";
  console.log(greeting);
}

const Kitten = mongoose.model('Kitten', kittySchema);
const fluffy = new Kitten({ name: 'fluffy' });
fluffy.speak(); // "Meow name is fluffy"

Guardar datos

fluffy.save((err, fluffy) => {
    err ? console.error(err) : fluffy.speak();
});

Recuperar los datos

Kitten.find((err, kittens) => {
    err? console.error(err) : console.log(kittens)
})

Hagamos Queries

Kitten.find({ name: /^fluff/ }, (err, kittens) => {
    err? console.error(err) : console.log(kittens)
});

Hagamos queries más complejas

Person.
  find({
    occupation: /host/,
    'name.last': 'Ghost',
    age: { $gt: 17, $lt: 66 },
    likes: { $in: ['vaporizing', 'talking'] }
  }).
  limit(10).
  sort({ occupation: -1 }).
  select({ name: 1, occupation: 1 }).
  exec(callback);

// Using query builder
Person.
  find({ occupation: /host/ }).
  where('name.last').equals('Ghost').
  where('age').gt(17).lt(66).
  where('likes').in(['vaporizing', 'talking']).
  limit(10).
  sort('-occupation').
  select('name occupation').
  exec(callback);

Recursos

Documentación

Mongoose: Queries y operadores

  • $or, $gt, $lte, etc...

Mongoose: Temas avanzados (Virtual, Hooks, Indexes...)

Virtuals

  • Nos permite virtualizar un campo
  • Podemos manejarlo al estilo getters y setters
  • Trabajaremos con this con lo que deberiamos evitar el uso de arrow functions
var virtual = schema.virtual('fullname');
virtual.get(function () {
  return this.name.first + ' ' + this.name.last;
});

Hooks

logo

Middleware (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. Middleware is specified on the schema level and is useful for writing plugins. Mongoose has 4 types of middleware: document middleware, model middleware, aggregate middleware, and query middleware. Document middleware is supported for the following document functions. mongoosejs

  • Nos suscribimos a cambios que pasan en las colecciones y modelos
  • Podemos sucribirnos en distintos momentos del ciclo de vida.
  • Podemos hacer una gestión sincrona o asincrona.
  • Para la gestión de las funciones asincronas usaremos next (segundo parámetro) como en Express.
  • Funciona como un middleware
  • Trabajaremos con this con lo que deberiamos evitar el uso de arrow functions
schema.pre('save', function() {
  return doStuff().
    then(() => doMoreStuff());
});

// Or, in Node.js >= 7.6.0:
schema.pre('save', async function() {
  await doStuff();
  await doMoreStuff();
});

Indexes

  • Se pueden hacer sobre un campo o multiples campos
  • Los esquemas pueden ser a multiples niveles
  var animalSchema = new Schema({
    name: String,
    type: String,
    tags: { type: [String], index: true } // field level
  });

  animalSchema.index({ name: 1, type: -1 }); // schema level

En resumen

meme

¡Al ataque!

mLab

logo

Claves

  • Cloud Automation
  • Backup & Recovery
  • Monitoring & Analytics Tools
  • Advanced Security
  • Easy-to-use Data Browser
  • Best-in-Class Database Support

Recursos

Otros

  • waterline An adapter-based ORM for Node.js with support for mysql, mongo, postgres, nedb, redis, and more
  • prisma.io Prisma replaces traditional ORMs
  • hasura.io Instant Realtime GraphQL on Postgres
  • MongoDB Stitch Plataforma Serverless de MongoDB
  • node-orm2 Object Relational Mapping