Академический Документы
Профессиональный Документы
Культура Документы
CON MONGODB
Universidad de Manizales
Noviembre 21 de 2015
- Egresado U. de Caldas
RELACIONALES
NO SQL Multidimensional
BASE DE DATOS RELACIONALES
Problema: No exista
una implementacin
estndar La forma
Sistema de archivos
de acceder a los
planos fue creado.
datos.
Problema: No
controlan grandes
datos.
Las bases de datos
relacionales fueron
creadas.
- Simple de administrar.
- Simple de disear
ESCALAN DE FORMA HORIZONTAL
MAESTRO
ESCLAVOS
TIPOS DE BASE DE DATOS NoSQL
LLAVE-VALOR
MAPEO DE COLUMNAS
ORIENTADA A DOCUMENTOS
QU VENTAJAS OFRECEN?
- Rendimiento
Colecciones Tablas
Documentos BSON vs Tablas?
Las colecciones y documentos
SERVIDOR
BASE DE DATOS
contiene COLECCIONES
contiene DOCUMENTOS
Mongodb Almacenamiento
- Diferentes campos
- Diferentes tamaos
- Indexables
COLECCIN Y DOCUMENTOS
EJEMPLO
Formato
{ tipo JSON
"_id" : ObjectId("55dc59bdc904711e10000001"),
Nombre: Juan Pablo,
Apellido: Ospina,
Tel: 339393939
},
{
"_id" : ObjectId("55dc59bdc904711e10000002"), Coleccin
Nombre: Pepito,
Apellido: Perez, Documento
Tel: 339393939
},
{
"_id" : ObjectId("55dc59bdc904711e10000003"),
Nombre: Antonio,
Apellido: Osorio,
Tel: 339393939
}
Estructura con vectores
{
"_id" : ObjectId("55dc59bdc904711e10000001"),
Nombre: Juan Pablo,
Apellido: Ospina,
Gustos: [Computacin, Software libre]
},
{
"_id" : ObjectId("55dc59bdc904711e10000002"),
Nombre: Pepito,
Apellido: Perez,
Gustos: [Msica, Pelculas]
},
{
"_id" : ObjectId("55dc59bdc904711e10000003"),
Nombre: Antonio,
Apellido: Osorio,
Gustos: [Deporte, Libros]
}
Diferente tamaos y campos
{
"_id" : ObjectId("55dc59bdc904711e10000001"),
Nombre: Juan Pablo,
Apellido: Ospina,
Gustos: [Computacin]
},
{
"_id" : ObjectId("55dc59bdc904711e10000002"),
Nombre: Pepito,
Apellido: Perez,
Proyectos: [sage-math,ESAPI]
},
{
"_id" : ObjectId("55dc59bdc904711e10000003"),
Nombre: Antonio,
Apellido: Osorio,
Gustos: [Deporte, Libros, Cine]
}
Un documento un poco ms
complejo
{
"_id" : ObjectId("55dc59bdc904711e10000001"),
Nombre: Juan Pablo,
Apellido: Ospina,
Gustos: [Computacin]
Contacto: {
Twitter: @gnupablo,
Email: gnu.pablo@gmail.com Documento anidado
}
},
{
"_id" : ObjectId("55dc59bdc904711e10000002"),
Nombre: Pepito,
Apellido: Perez,
Proyectos: [sage-math,ESAPI]
},
Comenzando con la Consola
$ mongo Nuestra
MongoDB shell version: 3.0.7 terminal
connecting to: test
>
MongoDB viene con mtodos de ayuda para hacer ms fcil la interaccin con
la base de datos
MongoDB viene con mtodos de ayuda para hacer ms fcil la interaccin con
la base de datos
Muestra las lista de comandos
> help
> use taller db.help() .
switched to db taller ..
> db > show dbs
taller Test 0.078GB
Taller 0.078GB
> db.usuarios.find()
{ "_id" : ObjectId("564ea458619102b4d26aa33f"),
"nombre" : "juan",
"edad" : "25" }
{ "_id" : ObjectId("564ea4ee619102b4d26aa340"),
"nombre" : "antonio",
"edad" : "45" }
Consultando un documento de una
coleccin
Podemos ejecutar un query de igualdad especificando el campo que se quiere
consultar junto con el valor.
> db.usuarios.find({nombre:juan})
{ "_id" : ObjectId("564ea458619102b4d26aa33f"),
"nombre" : "juan",
"edad" : "25" }
BSON:
- Null
Almacenando un documento ms
complejo
> db.platos.insert({
"nombre" : "lasagna",
"precio" : 10,
"fecha" : new Date(2014,8,14),
"ingredientes" : [ "pollo", "pasta", "queso" ],
"calificacin" : { "sabor" : 5, "presentacin" : 3 } })
Encontrar un plato por ingrediente
Los vectores son tratados de forma individual, esto significa que se pueden consultar
especificando el nombre del campo del vector y el valor
> db.platos.find({"ingredientes":"pollo"})
{ "_id" : ObjectId("564eb95e0d71c45c6e4f9be3"),
"nombre" : "lasagna",
"precio" : 10,
"fecha" : ISODate("2014-09-14T05:00:00Z"),
"ingredientes" : [ "pollo", "pasta", "queso" ] }
Encontrar un plato por calificacin
> db.platos.find({"calificacin.sabor":5})
{ "_id" : ObjectId("564ebcfa0d71c45c6e4f9be4"),
"nombre" : "lasagna",
"precio" : 10,
"fecha" : ISODate("2014-09-14T05:00:00Z"),
"ingredientes" : [ "pollo", "pasta", "queso" ],
"calificacin" : { "sabor" : 5, "presentacin" : 3 } }
Validaciones en los Insert
> db.platos.insert({
"nombre" : "perro caliente",
"precio" : diez dolares,
"fecha" : new Date(2014,8,14),
"ingredientes" : [ "pollo", "pasta", "queso" ],
"calificacin" : { "sabor" : 5, "presentacin" : 3 } })
Validaciones en los Insert
Mongo solo hace cumplir algunas reglas, lo que quiere decir que debemos
encargarnos en el lado del cliente y del servidor que los datos ingresados son
correctos.
Parmetro de la consulta
Ahora podemos crear una coleccin llamada logs para almacenar el nmero de platos
servidos.
Podemos utilizar el operador $inc para incrementar el valor contador del documento
log
> db.logs.update({plato:hamburguesa},
{$inc: {contador: 1}})
> db.logs.update({plato:lasagna},
{$inc: {contador: 1}})
WriteResult({ "nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0 })
Actualizando un documento que no
existe
> db.logs.update({plato:lasagna},
{$inc: {contador: 1}}
{upsert: true})
WriteResult({ "nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0 })
EJERCICIOS
+ Ingresar 3 profesores (helena, carlos, antonio) (al menos que dicte matemticas)
+ Ingresar 5 estudiantes (mara, juliana, toms, juan, lucia) al menos dos cursando
biologa.
+ Ingresar 2 del personal (pedro, andrs)
Las clases que estn disponibles son: matemticas, biologa, programacin, arte,
qumica, filosofa, gentica
> db.logs.update({plato:lasagna},
{$unset: {contador: }}
{multi: true})
WriteResult({ "nMatched" : 2,
"nUpserted" : 0,
"nModified" : 2 })
Mejorando las colecciones II
> db.logs.update({plato:lasagna},
{$rename: {contador: npedido}}
{multi: true})
WriteResult({ "nMatched" : 2,
"nUpserted" : 0,
"nModified" : 2 })
Actualizando un array
> db.platos.update({"ingredientes":"huevo"},
{"$set":{"ingredientes":"carne"}})
WriteResult({ "nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1 })
Como los valores de un array son de forma individual podemos acceder a ello con
la notacin punto y especificando la ubicacin que tiene el valor en el vector.
> [frijol,arroz,huevo]
Ingredientes.2
> [frijol,arroz,huevo]
> [lentejas,huevo,arroz]
Ingredientes.1
Actualizando un array II
> db.platos.update({"ingredientes":"huevo"},
{"$set":{"ingredientes.$":"carne"}},{multi:true})
Eliminando el primer o ltimo
elemento de un array
Figuras
- rea
Rectngulo
Circulo Cuadrado
- base
radio -l
- altura
Tiene el principio de
Herencia
> db.figuras.find()
{_id: 1, tipo: circulo, rea: 3.14, radio: 1}
{_id: 2, tipo: cuadrado, rea: 4, l: 2}
{_id: 3, tipo: rectngulo, rea: 10, base: 5, altura: 2}
Uno a muchos:
Comentarios en un Blog
{ "_id" : ObjectId("564f7255021948d00b4e47d4"),
autor: pepito,
fecha: ISODate("2015-10-21T05:00:00Z"),
texto: Camino a la luna,
tags: [comics, aventura],
Comentarios: [
{
Autor: Alejandra,
fecha: ISODate("2015-11-08T05:00:00Z"),
texto: Es un gran comic,
Voto: 5
}],
contador_comentarios: 1
}
Uno a muchos:
Comentarios en un Blog
{ "_id" : ObjectId("564f7255021948d00b4e47d4"),
autor: pepito,
fecha: ISODate("2015-10-21T05:00:00Z"),
texto: Camino a la luna,
tags: [comics, aventura],
Comentarios: [
{
Autor: Alejandra,
fecha: ISODate("2015-11-08T05:00:00Z"),
texto: Es un gran comic,
Voto: 5
}],
contador_comentarios: 1
}
Uno a muchos:
Comentarios en un Blog
{ "_id" : ObjectId("564f7255021948d00b4e47d4"),
autor: pepito,
fecha: ISODate("2015-10-21T05:00:00Z"),
texto: Camino a la luna,
tags: [comics, aventura]
}
Comentario
{
_id: ObjectId("564f7255021948d00b4e47d5")
post_id: ObjectId("564f7255021948d00b4e47d4"),
autor: Alejandra,
fecha: ISODate("2015-11-08T05:00:00Z"),
texto: Es un gran comic,
Voto: 5
}
Referencia vs Embebido
Producto
id Producto
Categora
- producto_id
Categora - categora_id
id
Muchos a Muchos: Categoras de un
producto
Productos
{ "_id" : ObjectId("564f7255021948d00b4e47d4"),
nombre: Libro de aventuras,
categoria_id: [ ObjectId("564f7255021948d00b4e47f4"),
ObjectId("564f7255021948d00b4e47r5")]}
}
Categoras
{ "_id" : ObjectId("564f7255021948d00b4e47f4"),
nombre: aventura,
productos_id: [ ObjectId("564f7255021948d00b4e47d4"),
ObjectId("564f7255021948d00b4e47t8")]
}
Muchos a Muchos: Categoras de un
producto
Productos
{ "_id" : ObjectId("564f7255021948d00b4e47d4"),
nombre: Libro de aventuras,
categoria_id: [ ObjectId("564f7255021948d00b4e47f4"),
ObjectId("564f7255021948d00b4e47r5")]}
}
Categoras
{ "_id" : ObjectId("564f7255021948d00b4e47f4"),
nombre: aventura,
}
EJERCICIO: Comercio Electrnico
Disear una base de datos en nosql para una plataforma de comercio electrnico que
vende msica y pelculas. Todos los productos tienen un nmero de referencia, un
titulo, una descripcin, adems tienen algunos datos de envo como el peso y sus
dimensiones, ancho, alto y profundidad. El precio esta compuesto por uno precio bruto
y precio neto. Los productos de tipo msica tienen en sus detalles el artista, la lista de
gneros al que pertenece el lbum y la lista de pistas. Por otro lado el producto pelcula
tiene en sus detalles el director, la lista de actores y los idiomas. Adems los productos
tienen mltiples comentarios de los usuarios con el nombre del usuarios que lo publico
y el texto
Un comercio electrnico genera una orden despus de haber comprado algo, para eso
se tiene que almacenar la fecha de creacin, los datos de envo (cliente, direccin,
ciudad), el pago que tiene el mtodo (visa, mastercard, amex) junto a un id de la
transaccin, por ltimo esta compuesto por la lista de productos y el total de la compra.
Las consultas pueden ser basadas en mltiples criterios, solo es necesario pasarlos
separados por comas
> db.platos.find({nombre:lasagna,"ingredientes":"pollo"})
{ "_id" : ObjectId("564eb95e0d71c45c6e4f9be3"),
"nombre" : "lasagna",
"precio" : 10,
"fecha" : ISODate("2014-09-14T05:00:00Z"),
"ingredientes" : [ "pollo", "pasta", "queso" ] }
Consultar por comparaciones
> db.platos.find({precio:{$lt:10})
Encontrar un plato en un rango de
precio
> db.platos.find({precio:{$gt:7,$lt:12})
Consulta no es igual a
> db.platos.find({nombre:{$ne:lasagna)
Consultar un rango en un array
Por ejemplo cuando se tiene un array con un conjunto de nmeros y se quiere utilizar
los operadores $lt o $gt podemos hacerlo con el operador $elemMatch.
> db.platos.find({talla:{$elemMatch:{$gt:36,$lt:38})
Ejercicio
Consultar con el operador $ne todos los productos que su vendedor no sea
hp.
Instalacin de ejemplo php
<?php
//conecta a localhost:27017
$connection = new Mongo();
Conexin persistente
<?php
$connection = new Mongo("localhost:27017",
array("persist" => "x"));
?>
Conexin en php
<?php
//conecta a localhost:27017
$connection = new Mongo();
Conexin persistente
<?php
$connection = new Mongo("localhost:27017",
array("persist" => "x"));
?>
Almacenando un documento en php
<?php
try{
$mongo= new Mongo("localhost:27017", array("persist" => "x"));
$db = $mongo->comedy;
$collection = $db->cartoons;
$obj = array( " title " => "Calvin and Hobbes", "author" => "Bill
Watterson" );
$collection->insert($obj);
$cursor = $collection->find();
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
} catch (MongoCursorException $e) {
die("Query failed " . $e -> getMessage());
}
MUCHAS
GRACIAS!