NoSQL: MongoDB y MongoMapper
Patrick Aljord, David y Jorge Cuadrado
=   +
Tokyo Cabinet
Características


Esquema libre
Distribuidas y escalables
Capacidad de manejo de
grandes volúmenes de datos
Performance/re...
Tipos de NoSQL


Key/Value (Llave/valor)
Column-oriented (orientadas a columnas)
Document-oriented (orientadas a
documento...
Key/Value
¿Qué es?
  una llave
  un blob

Ventajas:
  muy simple para implementar
  muy rapido

Útil para:
    el cache
  ...
Column-oriented
¿Qué es?
  utiliza tablas dinamicas
  mas flexible que tablas de RDBMS
  multi-dimensional

Ventajas:
  el...
Document-oriented
¿Qué es?
   formato json o xml
   muy flexible

Ventajas:
   simple
   rapido, pero menos que key/value ...
La soluciones que aporta el NoSQL

built-in replication, master a master
Map/Reduce
mas simple de instalar (se necesita to...
¿Qué es el map/reduce?



permite operaciones de manipulacion en batch de
datos manipulation y operaciones de agregacion d...
¿Concretamente que es
    map/reduce?
¿Que es el map?

El map es aplicar una funcion sobre cada elemento de una
matriz y retornar una matriz con sus elementos
m...
¿Qué es el reduce?

  Reduce es aplicar una funcion sobre cada elemento de una
  matriz y retornar un solo elemento. Se ha...
Las ventajas del map/reduce



    Esta hecho para poderse ejecutar en paralelo
             Como todo es colecciones
    ...
(credit: amazon)
Las principales funcionalidades

Document-oriented storage
Consultas
Modificadores atómicos
Map/Reduce
GridFS: Almacenamie...
¿Como instalar mongodb?

1. Para instalar mongodb descargamos el binario
   correspondiente para nuestro sistema operativo...
¿Como instalar mongodb?

Para los sistemas unix*(linux,freebsd, OSX) es recomendado
usar el sistema de paquetes de cada si...
¿ Cómo se guardan los datos en
         mongodb?




                  Colección:
Documento:
                  la música q...
¿BSON?
{
    nombre: "Yellow Submarine",
    autor: "The Beatles",
    canciones: ["Yellow Submarine", "Only A Northern So...
Empotrar vs Referenciar
{
    nombre: "Yellow Submarine",
    autor: "The Beatles",
    canciones: [ { name: "Yellow Subma...
¿Cómo conectarse a mongodb?
                     console: ./bin/mongo

Drivers Oficiales:                 Drivers Comunita...
¿Cómo añadir y eliminar documentos a
         una colección?
./mongo
> use tienda_de_musica
> album = {
 nombre: "Let it b...
¿Cómo actualizar un documento?

Guardar

> album = db.musica.find(ObjectId
("4c10a976eaa67158a0d74b4b" );
> ...
> album.ge...
¿Como actualizar un documento?
Modificadores
db.coleccion.update( criterio_de_busqueda,
                  objeto_o_operado...
Un poco más acerca de los
               modifcadores
$set y $unset: sirven para asignarle y quitarle el valor a un
campo ...
¿Cómo hacer consultas en mongodb?
Operadores condicionales para describir criterios de búsqueda:
$gt(>) $lt(<), $gte(<=), ...
¿Cómo hacer consultas en mongodb?
WHERE
sql> select * from musica where cantidad=1;
> db.musica.find(cantidad: 1);
sql> se...
¿Cómo hacer consultas en mongodb?
COUNT
sql>SELECT COUNT(*) FROM musica WHERE autor = "The
Beatles";
>db.musica.count({aut...
¿Cómo hacer consultas en mongodb?
GROUP BY
sql>select autor, count(*) from musica where genero="rock"
group by autor

db.m...
¿Como usar map/reduce en mongodb?

   utiliza JavaScript con Spidermonkey de Mozilla

   se puede pasar cualquier coleccio...
¿GridFS?

Almacenamiento de archivos de todo tamaño sin
comprometer su stack.

Viene con binarios y bibliotecas

API simpl...
Sharding

 Auto-Sharding
 particionamento de los datos en varios servidor
 sharding por coleccion
 proceso mongos (routing...
Sharding
http://mongomapper.com/
http://github.com/jnunemaker/mongomapper
¿Como empezar a usar
              MongoMapper?
Instalar
>sudo gem install mongo_mapper
>sudo gem install bson_ext

Inclui...
¿Como empezar a usar
              MongoMapper?
Configurar la conexión a la base de datos
config/database.yml

development...
Incluir en el proyecto Rails
Configurar la conexión a la base de datos
config/initializers/mongodb.rb

db_config = YAML::l...
¿Cómo definir un modelo?

app/model/cancion.rb

class Album
 include MongoMapper::Document
 key :nombre, String
 key :auto...
¿Comó definir un modelo empotrado?

app/model/cancion.rb
class Cancion
  include EmbeddedDocument
  key :name, String
  ke...
¿Que tipo de llaves existen?

los tipos de llaves que estan definidos en MongoMapper son:

   ObjectID
   String
   Intege...
¿Se pueden definir nuevo tipos de
llaves?
class Point
 attr_reader :x, :y

 def self.to_mongo(value)...end
 def self.from_...
¿Cómo se definen las relaciones uno a
             muchos?
class Cancion
 ...
 key :album_id, ObjectID
 belongs_to :album
...
¿Cómo se definen las relaciones uno a
               uno?
class Cancion
 ...
 has_one :video
 ...
end

class Video
 ...
 k...
¿Cómo se definen las relaciones
         muchos a muchos?
class Cancion
 ...
 key :album_ids, Array
 many :albums, :in => ...
¿MongoMapper tiene
            relaciones polimorfas?
class Comment
 ...
 key :commentable_id, ObjectId
 key :commentable_...
¿Cómo añadir validaciones a los
              modelos?
class Album
 include MongoMapper::Document
 key :nombre, String, :u...
¿Qué validaciones existen en
              MongoMapper?
required => boolean
unique => boolean
format => regexp
in => array...
¿Cómo hacer consultas usando
            MongoMapper?
Modelo.find(id_o_ids)
> Album.find("4c10a976eaa67158a0d74b4b")> Albu...
¿Cómo usar los modificadores con
          MongoMapper?
Modelo.<modifcador>(<criterio>, <valores>)
modificador: increment,...
¿Preguntas?




http://nosql.shapado.com
Nosqlcp
Nosqlcp
Nosqlcp
Nosqlcp
Nosqlcp
Upcoming SlideShare
Loading in...5
×

Nosqlcp

1,739

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,739
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Nosqlcp

  1. 1. NoSQL: MongoDB y MongoMapper
  2. 2. Patrick Aljord, David y Jorge Cuadrado
  3. 3. = +
  4. 4. Tokyo Cabinet
  5. 5. Características Esquema libre Distribuidas y escalables Capacidad de manejo de grandes volúmenes de datos Performance/rendimiento
  6. 6. Tipos de NoSQL Key/Value (Llave/valor) Column-oriented (orientadas a columnas) Document-oriented (orientadas a documentos)
  7. 7. Key/Value ¿Qué es? una llave un blob Ventajas: muy simple para implementar muy rapido Útil para: el cache sistema de manejo de cola (redis) limitado para aplicaciones complejas
  8. 8. Column-oriented ¿Qué es? utiliza tablas dinamicas mas flexible que tablas de RDBMS multi-dimensional Ventajas: el sistema de consulta se acerca al de un RDBMS diseño de google, soporta grandes cargas versiones Útil para: grandes colecciones mapping de los datos a objetos no es natural (igual que rdbms)
  9. 9. Document-oriented ¿Qué es? formato json o xml muy flexible Ventajas: simple rapido, pero menos que key/value store mapea facilmente a un objeto (python, ruby, c++ etc) Útil para: aplicaciones web complejas todo tipo de aplicacion que utiliza documentos y necesita flexibilidad
  10. 10. La soluciones que aporta el NoSQL built-in replication, master a master Map/Reduce mas simple de instalar (se necesita tomar un curso para instalar a oracle o sqlserver) casi todas son software libre, muy accesible para todos hecho para programadores, mas orientadas a la programaciones (map/reduce lo entienden mejor los programadores que los administradores de base de datos)
  11. 11. ¿Qué es el map/reduce? permite operaciones de manipulacion en batch de datos manipulation y operaciones de agregacion de datos equivalente a GROUP BY en SQL
  12. 12. ¿Concretamente que es map/reduce?
  13. 13. ¿Que es el map? El map es aplicar una funcion sobre cada elemento de una matriz y retornar una matriz con sus elementos modificados. Ejemplo (en ruby): > matriz = [1,2] > matriz.map { |n| n+2 } => [3, 4]
  14. 14. ¿Qué es el reduce? Reduce es aplicar una funcion sobre cada elemento de una matriz y retornar un solo elemento. Se hace iterando sobre cada elemento de la matriz. Cada iteracion empieza con el valor retornado por la iteracion anterior y hace algo con esta. Por esta razón, un reduce se debe iniciar con una valor de entrada. ejemplo (en ruby), con valor de entrada igual a cero: > [1, 2, 3].reduce(0) do |sum, value| sum + value end => 6
  15. 15. Las ventajas del map/reduce Esta hecho para poderse ejecutar en paralelo Como todo es colecciones => Fácil de dividir en varias tareas Probado y comprobado por los grande(google, amazon, facebook)
  16. 16. (credit: amazon)
  17. 17. 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
  18. 18. ¿Como instalar mongodb? 1. Para instalar mongodb descargamos el binario correspondiente para nuestro sistema operativo http://www. mongodb.org/display/DOCS/Downloads 2. descomprimes el paquete y creas los directorios /data y /data/db o C:data y C:data dependiendo de tu SO 3. para iniciar el servicio corres el binario /bin/mongod o binmongod.exe que viene en el paquete que has descargado en el paso 1 para un entorno de producción se debe usar un sistema operativo de 64-bits.
  19. 19. ¿Como instalar mongodb? Para los sistemas unix*(linux,freebsd, OSX) es recomendado usar el sistema de paquetes de cada sistema operativo. adicionalmente 10gen provee de paquetes oficiales para las distribuciones Linux Debian, Ubuntu, CentOS y Fedora http://www.mongodb. org/display/DOCS/Ubuntu+and+Debian+packages http://www.mongodb. org/display/DOCS/CentOS+and+Fedora+Packages
  20. 20. ¿ Cómo se guardan los datos en mongodb? Colección: Documento: la música que tiene Álbum de un el almacén artista
  21. 21. ¿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 }
  22. 22. Empotrar vs Referenciar { nombre: "Yellow Submarine", autor: "The Beatles", canciones: [ { name: "Yellow Submarine", duracion: 159 }, { name: "Only A Northern Song", duracion: 204 }, { name: "All Together Now", duracion: 130 }, { name: "Hey Bulldog", duracion: 191 }, { name: "It's All Too Much", duracion: 384 }, { name: "All You Need Is Love", duracion: 231 }, ...], genero: "Rock", anho: 1969, cantidad: 20 }
  23. 23. ¿Cómo conectarse a mongodb? console: ./bin/mongo Drivers Oficiales: Drivers Comunitarios: C C# and .NET C++ Clojure Java Erlang Javascript Go Perl Groovy PHP Haskell Python node.js Ruby Lua LuaMongo Scala Scheme (PLT) Smalltalk http://www.mongodb.org/display/DOCS/Drivers
  24. 24. ¿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.music.remove({}); >db.music.remove({autor: "The Beatles"})
  25. 25. ¿Cómo actualizar un documento? Guardar > album = db.musica.find(ObjectId ("4c10a976eaa67158a0d74b4b" ); > ... > album.genero = "pop" > album.cantidad = 5 > db.musica.save(album);
  26. 26. ¿Como actualizar un documento? Modificadores db.coleccion.update( criterio_de_busqueda, objeto_o_operadores, [upsert?], [múltiple?]) >album.genero = "Rock" >db.musica.update( {_id: album._id}, album) >db.musica.update( {_id: ObjectId ("4c10a976eaa67158a0d74b4b")}, {$inc: { cantidad: -1 }}); >db.musica.update( _id: 10, $set: { cantidad: -1 }, true); http://www.mongodb.org/display/DOCS/Updating
  27. 27. 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
  28. 28. ¿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 } } ); Operadores solo para arreglos: >db.things.find(a : {$in: x} $in a incluye al menos un valor del arreglo x. $nin negación de $in >db.things.find(a : {$all: x} $all a incluye todos los valores de x http://www.mongodb.org/display/DOCS/Advanced+Queries
  29. 29. ¿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)
  30. 30. ¿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")
  31. 31. ¿Cómo hacer consultas en mongodb? GROUP BY sql>select autor, count(*) from musica where genero="rock" group by autor db.musica.group({key: { autor: true }, cond: { genero: "Rock" }, reduce: function(obj, prev) { prev.csum += obj.cantidad; }, initial: { csum: 0 }});
  32. 32. ¿Como usar map/reduce en mongodb? utiliza JavaScript con Spidermonkey de Mozilla se puede pasar cualquier coleccion al map, osea se puede usar toda la flexibilidad de las consultas de MongoDB+Map/Reduce >db.collection.mapReduce(mapfunction,reducefunction[, options]); > m = function() { emit(this.user_id, 1); } > r = function(k,vals) { return 1; } > res = db.events.mapReduce(m, r, { query : {type:'sale'} }); > db[res.result].find().limit(2) { "_id" : 8321073716060 , "value" : 1 } { "_id" : 7921232311289 , "value" : 1 }
  33. 33. ¿GridFS? Almacenamiento de archivos de todo tamaño sin comprometer su stack. Viene con binarios y bibliotecas API simple: list, put, get
  34. 34. Sharding Auto-Sharding particionamento de los datos en varios servidor sharding por coleccion proceso mongos (routing) replica set chuncks config servers
  35. 35. Sharding
  36. 36. http://mongomapper.com/ http://github.com/jnunemaker/mongomapper
  37. 37. ¿Como empezar a usar MongoMapper? Instalar >sudo gem install mongo_mapper >sudo gem install bson_ext Incluir en el proyecto Rails agregar la la dependencia en config/environment.rb config.gem "mongo_mapper", :version => "0.7.6", :source => "http://gemcutter.org"
  38. 38. ¿Como empezar a usar MongoMapper? Configurar la conexión a la base de datos config/database.yml development: database: nombre-del-proyecto-development host: localhost port: 27017 test: database: nombre-del-proyecto-test production: database: nombre-del-proyecto-production
  39. 39. Incluir en el proyecto Rails Configurar la conexión a la base de datos config/initializers/mongodb.rb db_config = YAML::load(File.read(File.join(Rails.root, "/config/database.yml"))) if db_config[Rails.env] && db_config[Rails.env]['adapter'] == 'mongodb' mongo = db_config[Rails.env] MongoMapper.connection = Mongo::Connection.new(mongo ['hostname'], mongo['port'] || 27017, :logger => Rails.logger) MongoMapper.database = mongo['database'] MongoMapper.ensure_indexes! end
  40. 40. ¿Cómo definir un modelo? app/model/cancion.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
  41. 41. ¿Comó definir un modelo empotrado? app/model/cancion.rb class Cancion include EmbeddedDocument key :name, String key :duracion, Integer end app/model/album.rb class Album include MongoMapper::Document ... has_many :canciones, :class_name => "Cancion" end
  42. 42. ¿Que tipo de llaves existen? los tipos de llaves que estan definidos en MongoMapper son: ObjectID String Integer Boolean Array Hash Time Binary Set
  43. 43. ¿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
  44. 44. ¿Cómo se definen las relaciones uno a muchos? class Cancion ... key :album_id, ObjectID belongs_to :album ... end class Album ... has_many :canciones ... end
  45. 45. ¿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
  46. 46. ¿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
  47. 47. ¿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
  48. 48. ¿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
  49. 49. ¿Qué validaciones existen en MongoMapper? required => boolean unique => boolean format => regexp in => array not_in => array length => Integer/Range/Hash además puedes usar la api de validatable para agregar mas validaciónes validates_presence_of, validates_format_of, validates_true_for, etc http://validatable.rubyforge.org/
  50. 50. ¿Cómo hacer consultas usando MongoMapper? Modelo.find(id_o_ids) > Album.find("4c10a976eaa67158a0d74b4b")> Album.find (["4c10a976eaa67158a0d74b4b", "4c10a976eaa67158a0d74b4c"]) Modelo.first(criterio_opciones) > Album.first({:genero => "Rock"}) Modelo.all(criterio_opciones) >Album.all({:cantidad.lt => 5, :limit => 10, :order => "cantidad asc"}) >Model.paginate(criterio_opciones) Album.paginate(:per_page => 10, :page => 2, :genero => "Rock")
  51. 51. ¿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 >Album.decrement( { :id => "4c10a976eaa67158a0d74b4b"}, { cantidad: 1 }); >Album.add_to_set( {id: => "4c10a976eaa67158a0d74b4b"}, canciones: "Foo"}); >Album.collection.update(criteria, modificadores, opciones) >Album.collection.update({:genero => "Rock"}, { "$inc" => {: cantidad => 10}, "$pop" => {"canciones" : 1} }
  52. 52. ¿Preguntas? http://nosql.shapado.com

×