Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
BigTable
Características
Esquema libre
Distribuidas y escalables
Capacidad de manejo de
grandes volúmenes de datos
Performance/rendimiento
Tipos de NoSQL
Key/Value (Llave/valor)
Column-oriented (orientadas a columnas)
Document-oriented (orientadas a
documentos)
Key/Value
¿Qué es?
una llave
un blob
Ventajas:
muy simple para implementar
muy rapido
Útil para:
el cache(memcache)
sistema de manejo de cola (redis)
Ventajas:
el sistema de consulta se acerca al de un RDBMS
diseño de google, soporta grandes cargas
versiones
Útil para:
grandes colecciones
Ventajas:
mapea facilmente a un objeto (python, ruby, c++ etc)
Útil para:
aplicaciones web complejas
todo tipo de aplicacion que utiliza documentos y
necesita flexibilidad
La soluciones que aporta el NoSQL
Variedad de
consultas Rendimiento
Las principales funcionalidades
Document-oriented storage
Consultas
Modificadores atómicos
Map/Reduce
GridFS: Almacenamiento de archivos
Soporte para Full Index
Replicación & Alta Disponibilidad
Auto-Sharding
¿Como instalar MongoDB?
http://www.mongodb.
org/display/DOCS/Ubuntu+and+Debian+packages
http://www.mongodb.
org/display/DOCS/CentOS+and+Fedora+Packages
¿ Cómo se guardan los datos
en MongoDB?
Colección:
Documento:
la música que tiene
Álbum de un
el almacén
artista
¿BSON?
{
nombre: "Yellow Submarine",
autor: "The Beatles",
canciones: ["Yellow Submarine", "Only A Northern Song",
"All Together Now", "Hey Bulldog",
"It's All Too Much", "All You Need Is Love",
"Pepperland", "Sea Of Time",
"Sea Of Holes", "Sea Of Monsters",
"March Of The Meanies", "Pepperland Laid Waste",
"Yellow Submarine In Pepperland" ],
genero: "Rock",
anho: 1969,
cantidad: 20
}
¿Que tipos de datos se pueden
guardar en MongoDB?
ObjectID (identificador del documento)
Números(Reales y Enteros)
Arreglos
Objetos(Hash)
Binarios(Blobs)
Tiempos(UTC)
vacio(nil, null)
http://bsonspec.org/
¿Cómo conectarse a mongoDB?
console: ./bin/mongo
Cancion
{ nombre: "Yellow Submarine", duracion: 159, album_id: "aaa" },
{ nombre: "Only A Northern Song", duracion: 204, album_id: "aaa" }
{ nombre: "All Together Now", duracion: 130, album_id: "aaa" }
{ nombre: "Hey Bulldog", duracion: 191, album_id: "aaa" }
{ nombre: "It's All Too Much", duracion: 384, album_id: "aaa"}
{ nombre: "All You Need Is Love", duracion: 231, album_id: "aaa"}
Referenciar o Empotrar
{
nombre: "Yellow Submarine",
autor: "The Beatles",
canciones: [ { nombre: "Yellow Submarine", duracion: 159 },
{ nombre: "Only A Northern Song", duracion: 204 },
{ nombre: "All Together Now", duracion: 130 },
{ nombre: "Hey Bulldog", duracion: 191 },
{ nombre: "It's All Too Much", duracion: 384 },
{ nombre: "All You Need Is Love", duracion: 231 },
...],
genero: "Rock",
anho: 1969,
cantidad: 20
}
¿Cómo añadir y eliminar documentos a
una colección?
./mongo
> use tienda_de_musica
> album = {
nombre: "Let it be", autor: "The Beatles", canciones: [],
genero: "Rock", anho: 1970, cantidad: 10 }
> db.musica.save(album);
> db.musica.find();
{ "_id" : ObjectId("4c10a976eaa67158a0d74b4b"), "nombre":
"Let it be", "autor" : "The Beatles", "canciones" : [ ], "genero" :
"Rock", "anho" : 1970, "cantidad" : 10 }
>db.musica.remove({});
>db.musica.remove({autor: "The Beatles"})
¿Como actualizar un documento?
Modificadores
db.coleccion.update( criterio_de_busqueda,
objeto_o_operadores,
[upsert?], [múltiple?])
http://www.mongodb.org/display/DOCS/Updating
Un poco más acerca de los
modifcadores
$set y $unset: sirven para asignarle y quitarle el valor a un
campo de un documento respectivamente.
$inc: incrementan el valor asignado a un campo, solo es valido
para valores enteros.
$push,$pushAll: añaden uno o varios valores a un arreglo de
datos contenido en un campo del documento.
$addToSet: añade un valor a un arreglo si el valor no esta
repetido.
$pop, $pull, $pullAll: son operadores para borrar los valores
contenidos en un arreglo.
http://www.mongodb.org/display/DOCS/Updating
¿Cómo hacer consultas en MongoDB?
Operadores condicionales para describir criterios de búsqueda:
$gt(>) $lt(<), $gte(<=), $lte(>=), $ne(!=)
>db.things.find({j : {$lt: 3}});
$exists chequea que el documento tenga o no un campo
> db.things.find( { a : { $exists : true } } );
http://www.mongodb.org/display/DOCS/Advanced+Queries
¿Cómo hacer consultas en MongoDB?
WHERE
sql> select * from musica where cantidad=1;
> db.musica.find({cantidad: 1});
sql> select nombre from musica where cantidad<2;
> db.musica.find({cantidad: {$lt: 2}}, {'nombre': 1});
sql>select * from musica where name like 'The%';
>db.musica.find( { name : /^The/ } );
ORDER BY
sql> select * from musica ORDER BY anho desc;
> db.musica.find({}).sort({anho: -1});
LIMIT y OFFSET
sql> select * from musica LIMIT 10 OFFSET 5;
>db.musica.find().skip(5).limit(10)
¿Cómo hacer consultas en MongoDB?
COUNT
sql>SELECT COUNT(*) FROM musica WHERE autor = "The
Beatles";
>db.musica.count({autor: "The Beatles"})
DISTINCT
sql> select distinct autor from musica;
>db.musica.distinct("autor")
¿Cómo hacer consultas en MongoDB?
GROUP BY
sql>select autor, count(*) from musica where genero="rock"
group by autor
Auto-Sharding
particionamento de los datos en varios servidor
sharding por coleccion
proceso mongos (routing)
replica set
Sharding
http://www.mongodb.org/display/DOCS/Sharding+Introduction
Información Geo espacial
¿Quienes usan MongoDB?
http://www.mongodb.
org/display/DOCS/Production+Deployments
http://mongomapper.com/
http://github.com/jnunemaker/mongomapper
¿Como empezar a usar
MongoMapper?
Instalar
>sudo gem install mongo_mapper
development:
database: nombre-del-proyecto-development
host: localhost
port: 27017
test:
database: nombre-del-proyecto-test
production:
database: nombre-del-proyecto-production
Incluir en el proyecto Rails
Configurar la conexión a la base de datos
config/initializers/mongodb.rb
MongoMapper.setup(YAML.load_file(Rails.root.join('config',
'database.yml')), Rails.env, { :logger => Rails.logger, :passenger =>
false })
¿Cómo definir un modelo?
app/model/album.rb
class Album
include MongoMapper::Document
key :nombre, String
key :autor, String
key :genero, String
key :anho, Integer
key :cantidad, Integer
key :canciones, Array
end
¿Comó definir un modelo empotrado?
app/model/cancion.rb
class Cancion
include MongoMapper::EmbeddedDocument
key :name, String
key :duracion, Integer
end
app/model/album.rb
class Album
include MongoMapper::Document
...
has_many :canciones, :class_name => "Cancion"
end
¿Que tipo de llaves existen?
ObjectID
String
Integer
Boolean
Array
Hash
Time
Binary
Set
¿Se pueden definir nuevo tipos de
llaves?
class Point
attr_reader :x, :y
def self.to_mongo(value)...end
def self.from_mongo(value)...end
def initialize(*args)...end
end
¿Cómo se definen las relaciones uno a
muchos?
class Album
...
has_many :canciones
...
end
class Cancion
...
key :album_id, ObjectID
belongs_to :album
...
end
¿Cómo se definen las relaciones uno a
uno?
class Cancion
...
has_one :video
...
end
class Video
...
key :cancion_id, ObjectID
belongs_to :cancion
...
end
¿Cómo se definen las relaciones
muchos a muchos?
class Cancion
...
key :album_ids, Array
many :albums, :in => :album_ids
...
end
class Album
...
key :canciones_ids, Array
has_many :canciones, :in => :canciones_ids
...
end
¿MongoMapper tiene
relaciones polimorfas?
class Comment
...
key :commentable_id, ObjectId
key :commentable_type, String
belongs_to :commentable, :polymorphic => true
end
class Album
...
has_many :comments, :as => :commentable, :class_name =>
"Comment"
end
¿Cómo añadir validaciones a los
modelos?
class Album
include MongoMapper::Document
key :nombre, String, :unique => true
key :autor, String, :required => true
key :genero, String, :in => ["Rock", "Pop", "Tropical"]
key :anho, Integer
key :cantidad, Integer
validates_presence_of :nombre, :message => "no ah sido
asignado"
many :canciones
end
¿Qué validaciones existen en
MongoMapper?
required => boolean # necesaria
unique => boolean # unica
format => regexp # con un formato
in => array # incluida
not_in => array # excluida
length => Integer/Range/Hash # tamaño
Modelo.all(criterio_opciones)
>Album.all({:cantidad.lt => 5, :limit => 10, :order => "cantidad
asc"})
>Modelo.paginate(criterio_opciones)
Album.paginate(:per_page => 10, :page => 2, :genero
=> "Rock")
¿Cómo usar los modificadores con
MongoMapper?
Modelo.<modifcador>(<criterio>, <valores>)
modificador: increment, decrement, set, unset, push, push_all,
add_to_set, pull, pull_all, pop
http://nosql.shapado.com