Skip to content

Latest commit

 

History

History
166 lines (128 loc) · 5.14 KB

File metadata and controls

166 lines (128 loc) · 5.14 KB

MongoDB

Mongodb es una base de datos NoSQL orientada a documentos.

Bases de datos

  • Forma de almacenar datos de forma estructurada
  • Permite consultar los datos

SQL (o relacionales)

Las bases de datos relacionales son tradicionalmente usadas en el mundo de los datos consistentes y estructurados. Se definen modelos, relaciones, y entidades, y a partir de ellos se crean tablas.

  • MySQL
  • MariaDB
  • PostgreSQL

NoSQL (o no necesariamente relacionales)

Las bases de datos NoSQL se diferencian de las SQL por el lenguaje de consulta. No todas las NoSQL son iguales, ni te ofrecen las mismas opciones

  • MongoDB (documentos)
  • Cassandra (tablas flexibles + claves compuestas)
  • Datastore (clave-valor + tablas clave-valor)
  • Redis (clave-valor + mapas)

Clave-Valor

Se define una clave única para toda la base de datos, y esa clave almacena un valor.

Imaginemos que queremos relacionar DNIs y Nombres:

  • Clave: 51511530B

  • Valor: Carlos ...

  • Clave: 52561430Y

  • Valor: Paco

  • Redis

  • Datastore

  • ~ firebase

Tablas flexibles

Son típicas estructuras de tabla, pero con la opción de añadir o eliminar columnas sin definirlo en el esquema. Te da una flexibilidad mayor a la hora de trabajar con los datos.

  • Cassandra
  • DynamoDB

Claves compuestas

Puede haber documentos con la misma clave principal, y se utiliza para realizar querys, ya que sólo se puede consultar por la clave principal.

  • Cassandra

Documentos

Almacenan un documento de texto plano. Normalmente piden que tenga cierta estructura, y normalmente esa estructura será un JSON. No requieren que definas nada. A menudo ofrecen búsquedas de texto, y gestión de campos.

  • Firebase
  • MongoDB

¿Cuando usar cada una? El teorema CAP

  • Wikipedia Una base de datos tiene que elegir dos de las tres opciones.

Las SQL son consistentes, y dependiendo de si necesias disponibilidad o tolerancia a particiones, elegirás una u otra. Las no relacionales son fuertes en disponibilidad.

MongoDB

Mongo es una base de datos muy potente y flexible. Desde MySQL la transición es bastante suave, y como primera base de datos para jugar también da mucho juego. Pero, ojo, también es una base de datos traicionera en algunos casos.

The good points:

  • Fácil de usar
  • Muchas querys disponibles, muuuuy flexible
  • No te preocupas por cómo se guardan los datos
  • No te preocupas (de primeras) por los índices

The bad parts:

  • Tiene tendencia a borrar o corromper los datos --> Haz backups!
  • No soporta muchísimas conexiones a la vez --> Vas a tener que replicarla
  • Gestionar múltiples instancias es complicado --> Si vas a crecer, empieza a pensar en sharding (repartir los datos)
  • Los servidores en producción son omplicados de manejar --> Busca a un buen sysadmin que te ayude

Entonces... ¿Por qué mongo?

Buena pregunta. Todas las bases de datos tienen sus puntos buenos, y sus puntos malos. Sin duda. Mongo te ofrece muchísima flexibilidad, y a cambio te pide que estés muy pendiente de darle amor a la base de datos.

La principal diferencia que vas encontrar con, por ejemplo, MySQL es que Mongo te va a pedir amorcito durante todo el ciclo de vida de tu app, pero vas a poder cambiarlo todo de arriba a abajo de un día para otro, y MySQL va a pedirte muuuucho amor y compromiso con tus modelos el día uno, y luego no va a volver a molestarte más.

Usando Mongo

npm install mongodb --save
const MongoClient = require('mongodb').MongoClient;

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'myproject';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  console.log("Connected successfully to server");
  
  // Preparamos la base de datos
  const db = client.db(dbName);
  
  // Cerramos la conexión
  client.close();
});

Insert

  • Docs

  • Insert

  • insertOne

  • insertMany

const collection = db.collection('documents');
// Insert some documents
collection.insert({a : 1}, function(err, result) {
    console.log(result);
    console.log("Inserted documents into the collection");
    callback(result);
});

Find

  • Docs

  • find

  • findAndModify

  • findAndRemove

  • findOne

  • findOneAndDelete

  • findOneAndReplace

  • findOneAndUpdate

collection.find({}).toArray(function(err, docs) {
    console.log("Found the following records");
    console.log(docs)
});

Query

collection.find({'a': 1}).toArray(...);

Update

collection.updateOne({ a : 2 }, 
  { $set: { b : 1 } }, 
  function(err, result) {
    console.log("Updated the document with the field a equal to 2");
    callback(result);
}); 

Delete

collection.deleteOne({ a : 3 }, function(err, result) {
    console.log("Removed the document with the field a equal to 3");
    callback(result);
});