Este es el segundo seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. En este seminario web mostraremos cómo construir una aplicación de creación de blogs en MongoDB.
5. Agenda del Curso
Date Time Webinar
25-Mayo-2016 16:00 CEST Introducción a NoSQL
7-Junio-2016 16:00 CEST Su primera aplicación MongoDB
21-Junio-2016 16:00 CEST Diseño de esquema orientado a documentos
07-Julio-2016 16:00 CEST Indexación avanzada, índices de texto y geoespaciales
19-Julio-2016 16:00 CEST Introducción al Aggregation Framework
28-Julio-2016 16:00 CEST Despliegue en producción
6. Resumen del webinar 1
• ¿Porqué existe NoSQL?
• Tipos de bases de datos NoSQL
• Características clave de MongoDB
• Tolerancia a fallos y persistencia de datos en MongoDB
• Escalabilidad en MongoDB
7. Agenda
• Vocabulario básico
• Instalación de MongoDB
• Construcción de una aplicación básica
• Creación de índices
• Optimización de queries con explain()
8. Concepts
Relational MongoDB
Database Database / Base de datos
Table Collection / Colección
Row Document / Documento
Index Index / Índice
Join Lookup
Foreign Key Reference / Referencia
Multi-table transaction Single document transaction
9. Installing MongoDB
$ curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.2.6.tgz
$ tar xzvf mongodb-osx-x86_64-3.2.6.tgz
x mongodb-osx-x86_64-3.2.6/README
x mongodb-osx-x86_64-3.2.6/THIRD-PARTY-NOTICES
x mongodb-osx-x86_64-3.2.6/MPL-2
x mongodb-osx-x86_64-3.2.6/GNU-AGPL-3.0
x mongodb-osx-x86_64-3.2.6/bin/mongodump
x mongodb-osx-x86_64-3.2.6/bin/mongorestore
x mongodb-osx-x86_64-3.2.6/bin/mongoexport
x mongodb-osx-x86_64-3.2.6/bin/mongoimport
x mongodb-osx-x86_64-3.2.6/bin/mongostat
x mongodb-osx-x86_64-3.2.6/bin/mongotop
x mongodb-osx-x86_64-3.2.6/bin/bsondump
x mongodb-osx-x86_64-3.2.6/bin/mongofiles
x mongodb-osx-x86_64-3.2.6/bin/mongooplog
x mongodb-osx-x86_64-3.2.6/bin/mongoperf
x mongodb-osx-x86_64-3.2.6/bin/mongosniff
x mongodb-osx-x86_64-3.2.6/bin/mongod
x mongodb-osx-x86_64-3.2.6/bin/mongos
x mongodb-osx-x86_64-3.2.6/bin/mongo
$ mkdir /data/CB
10. Running Mongod
Rubens-MacBook-Pro:mongodb-osx-x86_64-3.2.6 Ruben$ ./bin/mongod -dbpath /data/CB
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] MongoDB starting : pid=21526 port=27017
dbpath=/data/CB 64-bit host=Rubens-MacBook-Pro.local
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] db version v3.2.6
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] git version:
05552b562c7a0b3143a729aaa0838e558dc49b25
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] allocator: system
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] modules: none
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] build environment:
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] distarch: x86_64
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] target_arch: x86_64
2016-06-05T14:44:49.564+0200 I CONTROL [initandlisten] options: { storage: { dbPath: "/data/CB" }
}
2016-06-05T14:44:49.565+0200 I STORAGE [initandlisten] wiredtiger_open config:
create,cache_size=9G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast)
,log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=10000
0),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2016-06-05T14:44:50.316+0200 I NETWORK [HostnameCanonicalizationWorker] Starting hostname
canonicalization worker
2016-06-05T14:44:50.316+0200 I FTDC [initandlisten] Initializing full-time diagnostic data
capture with directory '/data/CB/diagnostic.data'
2016-06-05T14:44:50.511+0200 I NETWORK [initandlisten] waiting for connections on port 27017
11. Connecting Via The Shell
Ruben$ ./mongodb-osx-x86_64-3.2.6/bin/mongo
MongoDB shell version: 3.2.6
connecting to: test
> show databases
local 0.000GB
12. Inserting your first record
> use CB
switched to db CB
> show databases
local 0.000GB
> db.demo.insert({"nombre": "Rubén", "altura": 178})
WriteResult({ "nInserted" : 1 })
> show databases
CB 0.000GB
local 0.000GB
> show collections
demo
> db.demo.findOne()
{
"_id" : ObjectId("575420c87a75dbb02b4f45cb"),
"nombre" : "Rubén",
"altura" : 178
}
>
16. In MongoDB we build organically
> use blog
switched to db blog
> db.users.insert( { "username" : ”rterceno",
"password" : "top secret", "lang" : "ES" } )
WriteResult({ "nInserted" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("573afff65ee4be80385332a7"),
"username" : "rterceno",
"password" : "top secret",
"lang" : "ES"
}
17. How do we do this in a program?
package com.mongodb.rterceno;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class Demo {
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> users = blog.getCollection("users");
Document user = new Document("user","rterceno")
.append("lang", "ES");
users.insertOne(user);
}
}
18. Next up Articles
import [+]
import static java.util.Arrays.asList;
public class Demo {
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> articulos = blog.getCollection("articles");
String myName = "rterceno";
Document articulo = new Document("título","My article")
.append("autor", myName)
.append("texto", "Lorem ipsum dolor sit amet, […] commodo consequat.")
.append("tags", asList("demo","español","MongoDB"));
articulos.insertOne(articulo);
}
}
19. Create a new type of article
public class Demo {
static DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"
, Locale.ENGLISH);
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> articulos = blog.getCollection("articles");
String myName = "rterceno";
Document articulo = new Document("título","My article")
.append("autor", myName)
.append("texto", "Lorem ipsum dolor sit amet […] commodo
consequat.")
.append("tags", asList("demo", "español", "MongoDB"))
.append("fecha", new Date());
articulos.insertOne(articulo);
}
}
20. Make a lot of articles
public class Demo {
static DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"
, Locale.ENGLISH);
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> articulos = blog.getCollection("articles");
List<Document> list = new ArrayList<Document>();
for (int i=0; i<1000000; i++){
Document articulo = new Document("título”, "Mi artículo " + i)
.append("autor", "USER_" + Math.round(Math.random()*10000))
.append("texto", "Lorem ipsum dolor sit amet, […] ex ea commodo consequat.")
.append("tags", asList("demo", "español", "MongoDB"))
.append("fecha", new Date());
list.add(articulo);
if (i % 5000 == 4999){
articulos.insertMany(list);
list.clear();
}
}
}
}
32. We need an index
> db.users.createIndex( { username : 1 } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
33. Indexes Overview
• Parameters
• Background : Create an index in the background as opposed to locking the
database
• Unique : All keys in the collection must be unique. Duplicate key insertions will be
rejected with an error.
• Name : explicitly name an index. Otherwise the index name is selfgenerated from the
index fields.
• Deleting an Index
• db.users.dropIndex({ “username” : 1 })
• Get All the Indexes on a collection
• db.users.getIndexes()
34. Query Plan Execution Stages
• COLLSCAN : for a collection scan
• IXSCAN : for scanning index keys
• FETCH : for retrieving documents
• SHARD_MERGE : for merging results from shards
38. ¿Qué hemos aprendido?
• Cómo crear una base de datos y una colección
• Como insertar documentos
• Cómo realizar búsquedas
• Como hacer modificaciones de los documentos existentes
• Cómo borrar documentos
• Cómo comprobar la eficiencia de una operación
• Cómo crear índices
• Cómo averiguar los índices que se utilizan en una operación
39. Próximo Webinar
Diseño de esquema orientado a documentos
• 21 de Junio 2016 – 16:00 CEST, 11:00 ART, 9:00
• ¡Regístrese si aún no lo ha hecho!
• Las bases de datos de documentos requieren un enfoque distinto con
respecto a la organización de los datos.
• ¡Sin normalización! Creamos esquemas adaptados a nuestra aplicación
• Optimizaremos dichos esquemas a los patrones de acceso.
• Demostraremos que es fácil controlar estos esquemas.
• Regístrese en : https://www.mongodb.com/webinars
• Denos su opinión, por favor: back-to-basics@mongodb.com
Delighted to have you here. Hope you can make it to all the sessions. Sessions will be recorded so we can send them out afterwards so don’t worry if you miss one.
If you have questions please pop them in the sidebar.
This is javascript. Lazy evaluation. Databases and collections spring to life as needed.