9. Tipos de NoSQL
Key/Value (Llave/valor)
Column-oriented (orientadas a columnas)
Document-oriented (orientadas a
documentos)
10. 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
11. 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)
12. 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
13. 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)
14. ¿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
16. ¿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]
17. ¿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
18. 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)
21. 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
22. ¿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.
23. ¿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
24. ¿ Cómo se guardan los datos en
mongodb?
Colección:
Documento:
la música que tiene
Álbum de un
el almacén
artista
25. ¿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
}
26. 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
}
27. ¿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
28. ¿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"})
31. 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
32. ¿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
33. ¿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)
34. ¿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")
35. ¿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 }});
36. ¿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 }
38. Sharding
Auto-Sharding
particionamento de los datos en varios servidor
sharding por coleccion
proceso mongos (routing)
replica set
chuncks
config servers
42. ¿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"
43. ¿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
44. 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
45. ¿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
46. ¿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
47. ¿Que tipo de llaves existen?
los tipos de llaves que estan definidos en MongoMapper son:
ObjectID
String
Integer
Boolean
Array
Hash
Time
Binary
Set
48. ¿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
49. ¿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
50. ¿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
51. ¿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
52. ¿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
53. ¿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
54. ¿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/