JS, Node.js, Frontend, Backend, Firebase, Express, Patrones, HTML5_APIs, Asincronía, Websockets, Testing
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
- MongoDB pincha en hueso: nadie acepta su nueva licencia
- Red Hat elimina a MongoDB de RHEL 8 y Fedora debido a su licencia SSPL
Claves
- Flexibildiad 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
- Funcioan 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 general27017
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
- w3School | Node.js MongoDB
- Node.js MongoDB Tutorial with Examples
- MongoDB | Doc
- MongoDB | What is MongoDB?
- Learn MongoDB from MongoDB
- MongoDB | Blog
MongoDB: Instalación
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 actualesuse <nombre-db>
Cambia a la base de datosshow collections
Muestra las coleciones en esa base de datosdb.help()
Muesta la ayuda para ver todos los comandosdb.createCollection('<nombre-collection>')
Genera una nueva colección
MongoDB Compass (Community Edition)
Resumen rápido
Nueva forma de trabajar
Asociaciones
Recursos
Claves
- Es un ORM
- Las queries de Mongoose no son promosesas y es necesario usar
exec()
, detalles
Relación de Mongoose con MongoDB
Relación Mongoose con Express
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 Modelofilm
será la colecciónfilms
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"
fluffy.save((err, fluffy) => {
err ? console.error(err) : fluffy.speak();
});
Recuperar los datos
Kitten.find((err, kittens) => {
err? console.error(err) : console.log(kittens)
})
Kitten.find({ name: /^fluff/ }, (err, kittens) => {
err? console.error(err) : console.log(kittens)
});
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
- Web oficial
- Plugins
- Documentación
- Getting Started
- Mongoose js query cheatsheet
- Quickstart Mongoose Guide that will get you up to speed in no time
- Mongoose Getting Started
- Una introducción a Mongoose para MongoDB y Node.js
- MDN | Express Tutorial Part 3: Using a Database (with Mongoose)
- Guia express & mongoose para Node.js
- Building a Node.js Powered API with Express, Mongoose & MongoDB
- Introducing Mongoose to Your Node.js and Restify API
- Introduction to Mongoose for MongoDB
- How to Use Mongoose for MongoDB and NodeJS
- Simple example - Node.js, Restify, MongoDb and Mongoose
Documentación
- Guides | Schemas
- Guides | SchemaTypes
- Guides | Connections
- Guides | Models
- Guides | Documents
- Guides | Subdocuments
- Guides | Queries
- Guides | Validation
- Guides | Middleware
- Guides | Populate
- Guides | Discriminators
- Guides | Plugins
$or
,$gt
,$lte
, etc...
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
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();
});
- 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
¡Al ataque!
- Mongoose | Getting Started
- Mongoose | Guide
- madhums/node-express-mongoose-demo
- dreamerslab/express-todo-example
Claves
- Cloud Automation
- Backup & Recovery
- Monitoring & Analytics Tools
- Advanced Security
- Easy-to-use Data Browser
- Best-in-Class Database Support
Recursos
- Sitio Web
- mlab | Precios
- mlab | Documentación
- mlab | News
- mlab | Customer Case Studies
- mlab | Blog
- How to setup Express.js & MongoDB
- Heroku’s handshake with mlab
- Deploy Your Own REST API in 30 Mins Using mLab and Heroku
- 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