Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- mongod --dbpath /Users/antoniocachuan/data/db
- mongo en la otra consola
- SQL nace 1979 / 250mb $81k por año
- por ese motivo buscaron la forma de optimizar
- y asi Dennis Ritchie y Brien Kernighan
- creadores de C lograron bajar
- a $8000 y asi nace SQL y si miramos
- todo lo de la forma normal
- buscamos no repetir la data justamente para
- ahorrar costos
- Caracteristicas SQL
- Expressive Query Language & Secondary Indexes
- Strong Consistency
- Enterprise Management & Integrations
- De los años 70 han cambiado...
- En los 90 Google y Amazon vieron que sus
- necesidades no se abastecian con SQL
- Big Table y DynamoDB, funcionaban muy bien sobre sistemas distribuidos, servidores pequeños o medianos
- Eran Open Source
- Eran no Relacional, se llamaban base de datos de sistemas distribuido
- Origen del termino
- nace en realidad en el 2009 en una conferencia sobre sist. distribuido
- y alguien puso el Hashtag de #NoSQL
- Las Tec NoSQL responden
- Flexibilidad: dif tipos de datos, facil cambiar el modelo de dato
- Scalability Performance:
- Siempre prendida, despliegues globales.
- El mismo hardware tiene un mejor desempeño
- en NoSQl que en SQL por temas de diseño, optimizadas para dar un rendimiendo optimo, mientras que las otras era por temas de disco.
- Tipos de NoSQL Database, en funcion como almacenan los datos
- Key/Value Stores
- Column Stores
- Graph Stores
- Multi-model Databases
- Document Stores
- Las BD tienen que decidir entre Consistencia y Habilidad
- Dos personas en PER Y ESP quieren comprar
- un pasaje a NY y en cada pais hay un servidor
- y el servidor de PER le avisa a los otros
- pero si falla la conexion, hay dos opciones
- Disponibilidad: sigo trabajando despues y mas adelante resolvere el problema de comunicacion entre nodos
- Consistencia: Si los nodos no se pueden comunicar no dejo confirmar su reserva a nadie.
- Clave valor/ KEY/VALUE
- -Key es la llave primaria (indices) y value guardo lo que quiera
- -Single key lookup
- -Very fast single key lookup
- -Not so hot for "reverse lookups"
- Ej: carrito compra de amazon, lo busco por clave unica
- pero si quiero saber cuantos libros de pepito estan en los carritos, no se puede tan facilmente.
- Recordando: Row Stores (como funciona actualmente las RDBMS)
- -Data aliniada por fila Ej: MySQL
- -Lee una fila completa cada vez
- -Lectura requiriendo una o dos columnas no es muy optimo. Almacenados de forma lineal en el disco, Ej disco vete a la posicion 3540 y empieza a leer secuencialmente. Recordar que las BD relacionales se crearon hace mas de 40 años, cuando todo era mecanico en el disco, por eso para leer toda una fila esa es una solución optima.
- Ej yo se que cada registro mide 750 bytes
- y quiero leer una columna de varias filas
- tengo que leer
- Column Store
- Lo que antes guardabamos por fila,
- ahora es por columna
- Porque es atractivo?
- Mejor para OLAP que OLTP
- Append es preferido
- La lectura puede traer mas tada del disco
- en una sola busqueda
- Puedo optimizar el espacio porque tengo columnas con el mismo tipo de dato,
- Puedo tener indices parciales
- Puedo tener un numero limitado de columnas mas sencilla
- Los delete y update no son muy optimos
- Es mucho mas facil hacer insert, es mas orientada para analitica
- Graph Stores
- Vertices y nodos
- Ej: Soial Networks
- Optimo para representar conexiones
- Puede ser implementado como key value con la habilidad de guardar enlaces
- Si tu caso de uso no es un grafo, no necesitas una db graph
- Nos interesa mas las relaciones
- Ej redes nerunales trabajan mejor con db de grafos
- Multi-Model Database
- Combinan multiples modelos de almacenamiento y acceso
- Es recientemente nuevo
- "polyglot persistence" tengo que hacer update en oracle, mongo, sql server
- me ofrece interfas sql y no sql
- Document Store
- Son estructuras de datos ricas usando JSON
- Ej: Mongo DB, se familiariza con REST,
- No es lo mismo almacenar JSON que utilizar un JSON, poder indexar, acceder a la estructura
- Cualquiera puede ser primario
- si se cae uno las replicas pueden ser usadas como primarias
- Segunda Clase
- Database - Database
- Table Collection
- Row Document
- Index Index
- Join Lookup
- Foreign Key Reference
- Multi-table transaction - Single document transaction
- <code>
- ./bin/mongo
- show dbs
- db.demo.insert({nombre: "Antonio", apellido: "Terceño", email: ["acachuan@bcp.com.pe", "antoniocachuan@gmail.com"]})
- db.demo.insert({nombre: "Manuel", apellido: "montoya", email: ["mmontoya@bcp.com.pe", "manuel.montoya@gmail.com"]})
- db.demo.findOne()
- db.demo.find()
- db.demo.find().pretty()
- ¿Qué es el object _id? Siempre tiene que existir
- 575420c87a75dbb02b4f45cb
- TS------ID----PID-Count-
- Count es 6 bytes
- show.collections
- db.demo2.insert({x:1, y:2, z:3})
- show collections
- Aplicando:
- use blog
- db.users.insert({"username":"acachuan", "password":"top secret", "lang":"ES"})
- db.users.findOne()
- Mongo DB Datatypes
- null: sirve para representar valores que no existen
- { "primerNombre" : null }
- boolean: Para representar valores falso y verdadero
- { "esEditable" : true }
- number: soporta 64 bits floating-point, para procesar números enteros. MongoDB provee NumberLong y NumberInt que representa 4 y 8 bytes respectivamente.
- string: string representa colección de caracteres. Mongodb soporta UTF-*
- date: MongoDB stores dates in milliseconds
- { "birthday" : new Date(1501086866059)}
- array: A set or list of values represents arrays
- { "cities" : ["Lima", "Piura", "Arequipa"]}
- embedded document: another mongodb document like structure
- {
- "_id": ObjectId("597465456cd654"),
- "firstName": "Emilio",
- "lastName": "Alipazaga",
- "age": 45,
- "email": "antonio@gmail.com",
- "address":[
- {
- "city":"lima",
- "state": "LIM",
- "country": "Peru"
- }
- ]
- }
- Data es guardada en forma de colecciones
- Para crear una DB
- use antonio_db;
- La base por defecto de mongo es test
- show databases;
- Crear una colección
- db.createCollection("users_profile");
- Collections are schemaless
- The document is a collection of key-value pairs. The key is also known as an attribute.
- Ejemplo de documento:
- {
- "_id": ObjectId("4545ds545dsds"),
- "title": "MongoDB Overview",
- "description": "Mongo DB is no sql database",
- "tags" : [
- "MongoDB",
- "database",
- "NoSQL"
- ],
- "likes" : 100.0,
- "comments":[
- {
- "user":"user1",
- "message": "My first comment",
- "dataCreated": ISODate("2011-02-19T20:45:00.000Z"),
- "like":0.0
- },
- {
- "user":"user1",
- "message": "My first comment",
- "dataCreated": ISODate("2011-02-19T20:45:00.000Z"),
- "like":0.0
- }
- ]
- }
- SQL MongoDB
- Database Database
- Table Collection
- Row Document
- Column Field
- Caracteristicas
- Colecciones en MongoDB son schemaless
- La estructura de un solo documento es simple y claro
- Complex joins are not required as MongoDB database supports an embedded document structure
- MongoDB has rich query support
- MongoDB is easy to scale
- Conversion or mapping between database objects and application objects is simple as most of the application supports JSON mapping with database objects
- Usos o aplicaciones de MongoDB
- User profile: tiene campos como records criminales, promotions, telefonos,direcciones
- Product and catalog data:nuevos productos son agregados dia a dia
- Metadata: A veces se necesita metadata para describir nuestra data
- Content: MongoDB is mainly a document database
- Limitaciones Mongo
- Maximo tamaño de documento es 16mb
- Maximo anidamiento es 100
- Maximo namespace (database + collection name) es 123
- db name está limitado a 64 caracteres
- Operaciones
- Si insertamos un documento a una colección. Si la colección no existe MongoDB creará una nueva colección
- db.collection.insertOne();
- db.collection.insertMany();
- db.users_profile.insertOne(
- {
- userId: 1,
- firstName: "John",
- lastName: "Richard",
- age: 26,
- email: "john29992@mail.com"
- }
- )
- Este metodo retorna un documento que contiene documents_id
- insertMany() can insert multiple documents into single collection at a time. We have to pass an array of documents to the method
- db.users_profile.inserMany([
- {
- userId: 1, firstName: "John", lastName: "Richard", age: 26, email: "John@gmail.com"
- },
- {
- userId: 2, firstName: "Antonio", lastName: "Richard", age: 26, email: "antonio@gmail.com"
- },
- {
- userId: 3, firstName: "Martin", lastName: "Richard", age: 26, email: "Martin@gmail.com"
- }
- ])
- db.users_profile.insertOne({userId: 1,firstName: "John",lastName: "Richard",age: 26,email: "john29992@mail.com"})
- db.users_profile.insertMany([{userId: 1, firstName: "John", lastName: "Richard", age: 26, email: "John@gmail.com"},{userId: 2, firstName: "Antonio", lastName: "Richard", age: 26, email: "antonio@gmail.com"},{userId: 3, firstName: "Martin", lastName: "Richard", age: 26, email: "Martin@gmail.com"}]);
- En mongo cada document requiere un _id que actua como primary key
- Otros metodos:
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.findAndModify()
- db.collection.findOneAndUpdate()
- db.collection.findOneAndReplace()
- db.collection.save()
- db.collection.bulkWrite()
- Operaciones de lectura
- Para traernos todos los usuarios
- db.users_profile.find({});
- Para traernos con filtros
- db.users_profile.find({firstName: "Antonio"});
- Aplicando condicionales y operadores lógicos
- Usando In
- db.users_profile.find({
- firstName:{
- $in:["Antonio", "Jhon"]
- }
- });
- db.users_profile.find({firstName:{$in:["Antonio", "Jhon"]}});
- Usando And
- db.users_profile.find({
- firstName: "John",
- age:{$lt:29}
- });
- Equivalente "SELECT * FROM user_profiles WHERE firstName='John' AND age<30;"
- Apply the or
- db.users_profile.find({
- $or: [
- {"firstName": "John"},
- {"age": {$lt: 30}}
- ]
- });
- db.users_profile.find({
- "firstName":"John",
- $or : [
- { "age": {$lt: 30}},
- {"lastName": /^s/},
- ]
- });
- Equivalente
- SELECT * FROM user_profiles WHERE firstName='John'
- AND age<30 OR lastName like 's%';
- Operadores de comparacion
- Operator Description
- $eq Matches values that equals a specified value
- $gt Matches values that are greater than a specified value
- $gte Matches values that are greater than or equal to a specified value
- $lt Matches values that are less than a specified value$lteMatches values that are less than or equal to a specified value
- $ne Matches values that are not equal to a specified value
- $in Matches values that are specified in a set of values
- $nin Matches values that are not specified in a set of values
- Operadores logicos
- Operator
- Description
- $or
- Joins query clauses with the OR operator and returns all the documents that match any condition of the clause.
- $and
- Joins query clauses with the AND operator and returns documents that match all the conditions of all the clauses.
- $not
- Inverts the effects of the query expression and returns all the documents that do not match the given criteria.
- $nor
- Joins query clauses with the logical NOR operator and returns all the documents that match the criteria specified in the clauses.
- The Updade operation
- db.users_profile.updateOne({userId : 1}, {$set: { age:30 }})
- db.users_profile.updateMany({age : 30}, {$set: { age:35 }})
Add Comment
Please, Sign In to add comment