MONGODB
Una base de datos… NoSQL



                           Eduard Tomàs
                           eduard.tomas@raona.com
                           www.raona.com
                           @eiximenis
¿PORQUE NOSQL?
• Atomic                       • Basic Availability
• Consistent                   • Soft State
• Isolated                     • Eventual Consistency
• Durable
       • Consistency
       • Availabilty
       • Partition Tolerance
TIPOS DE BBDD NOSQL
•   Key / Value Pairs
•   Column Familiy
•   Documentales
•   ….
KEY / VALUE PAIRS STORES
• Los datos se almacenan en pares (clave, valor) donde
  clave es usualmente una cadena y el valor un blob
• Consultas: Solo por clave

                     0001010110010101100010100001010001000010010
     /users/1020
                        00010101010000000010111110101010101111

                     00011001100101011000101000010101101010010000
     /users/1021
                        01101010100000000101111101110010101110

                     0101010101000101010101001010010100010010010
   /fras/2011/1WE1
                          000100100100100000010100110111110
COLUMN FAMILY

  Clave      BcnDevCon
  Columnas   Lugar              Barcelona
             Inicio             17 / 11 / 2011
             Fin                19 / 11 / 2011

  Clave      Salón del Manga                      Ferias
  Columnas   Lugar               Barcelona
             Inicio              12 / 09 / 2011
             Visitantes          21428
             Artista invitado    Kurosawa
DE DOCUMENTOS
• Pueden verse como una key / value pair store donde el valor
  está en algún formato conocido (json, bson, xml,…)
• A diferencia de los anteriores al conocer el formato de los datos
  pueden realizarse operaciones en estos

             {                      {
             “nombre” : “Edu”,      “nombre” : “Joan”,
             “Twitter”:”Eiximenis”, “Empresa”:”raona”,
             “Ciudad”:”Igualada” “Ciudad”:”Bcn”,
             }                      “Edad” : “29”
                                    }
¿POR QUÉ MONGODB?
• Alto rendimiento
• Disponible en Windows, Unix, Mac,…
• La razón principal:
    • .NET C#                 • Haskell
    • Erlang                  • Perl
    • C / C++                 • Python
    • Java                    • Coldfusion
    • PHP                     • …
    • Ruby
CONCEPTOS DE MONGODB
• Base de Datos
• Colección
• Documento
• Schema free
OPERACIONES BÁSICAS DE MONGODB
•   Conectar con una base de datos
     • use BaseDeDatos
•   Insertar un documento
     • db.coleccion.insert({…})
•   Encontrar uno o más documentos
     • db.coleccion.find({…})
•   Ordenar
     • db.coleccion.find().sort({…})
•   Metaoperadores ($or, $and,$gt)
     • db.coleccion.find({$or[{…},{…},….]})
UPSERTS
• Reemplazar un documento
   • db.coleccion.update()
• Upsert de un documento (creación o reemplazo)
   • db.coleccion.save()
• Modificadores
   • $inc
   • $set / $unset
   • $push / $pull
   • …
MAP AND REDUCE
• Operación “equivalente” al GROUP BY de BBDD relacionales
• Posible de calcular en paralelo
• Posible de calcular con datos distribuídos entre distintas
  máquinas
• Se compone de dos pasos
    • Map -> De una colección recoge y transforma los datos en el
      formato necesario para Reduce.
    • Reduce -> Opera sobre los datos generados por Map
      efectuando los cálculos necesarios.
MAP…
{                                {                                {
    "_id" : "1",                     "_id" : “2",                     "_id" : “3",
    "BlogId" : "b1",                 "BlogId" : "b2",                 "BlogId" : "b2",
    "Titulo" : "foo",                "Titulo" : “bar",                "Titulo" : “bar",
    "Comentarios" : [                "Comentarios" : [                "Comentarios" : [
     {                                {                                {
        "Autor" : "eiximenis",           "Autor" : “pisukeman",           "Autor" : “bandolero",
        "Texto" : "...."                 "Texto" : "...."                 "Texto" : "...."
     },                               },                               },
     {                                {                                {
        "Autor" : "eiximenis",           "Autor" : "eiximenis",           "Autor" : “pisukeman",
        "Texto" : "...."                 "Texto" : "...."                 "Texto" : "...."
     }]                               }]                               }]
}                                }                                }
MAP…
{                                                           {“BlogId” : “b1”,
  "_id"{ : "1",                                             “NumComentarios” : 2}
  "BlogId" : "b1",
          "_id" : “2",
  "Titulo" : "foo", : "b2", {
          "BlogId"
  "Comentarios" : [            "_id" : “3",
          "Titulo" : “bar",
   {                           "BlogId" : "b2",
          "Comentarios" : [
      "Autor" : "eiximenis","Titulo" : “bar",               {“BlogId” : “b1”,
           {
                               "Comentarios" : [
      "Texto" : "...." : “pisukeman",                       “NumComentarios” :1}
              "Autor"
   },                           {
              "Texto" : "...."
   {                               "Autor" : “bandolero",
           }]
      "Autor" : "eiximenis", "Texto" : "...."
       }                                                    {“BlogId” : “b2”,
      "Texto" : "...."          },                          “NumComentarios” :2}
   }]                           {
}                                  "Autor" : “pisukeman",
                                   "Texto" : "...."
                                }]
                             }
… REDUCE
                        {“BlogId” : “b1”,
{“BlogId” : “b1”,
                        “NumComentarios” : 3}
“NumComentarios” : 2}
{“BlogId” : “b1”,                               {“BlogId” : “b1”,
“NumComentarios” :1}    {“BlogId” : “b2”,       “NumComentarios” : 12}
{“BlogId” : “b2”,       “NumComentarios” : 2}
“NumComentarios” :2}
 {“BlogId” : “b1”,                              {“BlogId” : “b2”,
 “NumComentarios” :7}   {“BlogId” : “b1”,       “NumComentarios” : 2}
{“BlogId” : “b2”,       “NumComentarios” : 9}
“NumComentarios” : 0}
{“BlogId” : “b1”,
                        {“BlogId” : “b2”,
“NumComentarios” :2}
                        “NumComentarios” : 0}
MAP / REDUCE EN MONGODB
                                                               {“_id” : “b1”,
•   2 funciones (map y reduce) escritas en javascript          [
•   Ejecutadas en el servidor                                  {“numcoments” : 2},
                                                               {“numcoments: 4}
function() {                                                   ]}
  emit(this.BlogId, {numcoments : this.Comentarios.length});
}


function(key, values) {
 var ret = {numcoments : 0};                                   {“_id” : “b1”,
 values.forEach(function(value) {                               “value” {
    ret.numcoments +=value.numcoments;                            “numcoments” : 6
 });                                                            }
 return ret;                                                   }
}
REPLICA SETS
• Redundancia de datos
• Tolerancia a fallos
• Un primario, varios secundarios
    • Escrituras: Solo a/desde el
      primario
    • Lecturas: Solo desde el
      primario o bien desde
      cualquier nodo
    • Si el primario cae, un
      secundario toma su rol de
      forma automática

MongoDb (BcnDevCon Nov 2011)

  • 1.
    MONGODB Una base dedatos… NoSQL Eduard Tomàs eduard.tomas@raona.com www.raona.com @eiximenis
  • 2.
    ¿PORQUE NOSQL? • Atomic • Basic Availability • Consistent • Soft State • Isolated • Eventual Consistency • Durable • Consistency • Availabilty • Partition Tolerance
  • 3.
    TIPOS DE BBDDNOSQL • Key / Value Pairs • Column Familiy • Documentales • ….
  • 4.
    KEY / VALUEPAIRS STORES • Los datos se almacenan en pares (clave, valor) donde clave es usualmente una cadena y el valor un blob • Consultas: Solo por clave 0001010110010101100010100001010001000010010 /users/1020 00010101010000000010111110101010101111 00011001100101011000101000010101101010010000 /users/1021 01101010100000000101111101110010101110 0101010101000101010101001010010100010010010 /fras/2011/1WE1 000100100100100000010100110111110
  • 5.
    COLUMN FAMILY Clave BcnDevCon Columnas Lugar Barcelona Inicio 17 / 11 / 2011 Fin 19 / 11 / 2011 Clave Salón del Manga Ferias Columnas Lugar Barcelona Inicio 12 / 09 / 2011 Visitantes 21428 Artista invitado Kurosawa
  • 6.
    DE DOCUMENTOS • Puedenverse como una key / value pair store donde el valor está en algún formato conocido (json, bson, xml,…) • A diferencia de los anteriores al conocer el formato de los datos pueden realizarse operaciones en estos { { “nombre” : “Edu”, “nombre” : “Joan”, “Twitter”:”Eiximenis”, “Empresa”:”raona”, “Ciudad”:”Igualada” “Ciudad”:”Bcn”, } “Edad” : “29” }
  • 7.
    ¿POR QUÉ MONGODB? •Alto rendimiento • Disponible en Windows, Unix, Mac,… • La razón principal: • .NET C# • Haskell • Erlang • Perl • C / C++ • Python • Java • Coldfusion • PHP • … • Ruby
  • 8.
    CONCEPTOS DE MONGODB •Base de Datos • Colección • Documento • Schema free
  • 9.
    OPERACIONES BÁSICAS DEMONGODB • Conectar con una base de datos • use BaseDeDatos • Insertar un documento • db.coleccion.insert({…}) • Encontrar uno o más documentos • db.coleccion.find({…}) • Ordenar • db.coleccion.find().sort({…}) • Metaoperadores ($or, $and,$gt) • db.coleccion.find({$or[{…},{…},….]})
  • 10.
    UPSERTS • Reemplazar undocumento • db.coleccion.update() • Upsert de un documento (creación o reemplazo) • db.coleccion.save() • Modificadores • $inc • $set / $unset • $push / $pull • …
  • 11.
    MAP AND REDUCE •Operación “equivalente” al GROUP BY de BBDD relacionales • Posible de calcular en paralelo • Posible de calcular con datos distribuídos entre distintas máquinas • Se compone de dos pasos • Map -> De una colección recoge y transforma los datos en el formato necesario para Reduce. • Reduce -> Opera sobre los datos generados por Map efectuando los cálculos necesarios.
  • 12.
    MAP… { { { "_id" : "1", "_id" : “2", "_id" : “3", "BlogId" : "b1", "BlogId" : "b2", "BlogId" : "b2", "Titulo" : "foo", "Titulo" : “bar", "Titulo" : “bar", "Comentarios" : [ "Comentarios" : [ "Comentarios" : [ { { { "Autor" : "eiximenis", "Autor" : “pisukeman", "Autor" : “bandolero", "Texto" : "...." "Texto" : "...." "Texto" : "...." }, }, }, { { { "Autor" : "eiximenis", "Autor" : "eiximenis", "Autor" : “pisukeman", "Texto" : "...." "Texto" : "...." "Texto" : "...." }] }] }] } } }
  • 13.
    MAP… { {“BlogId” : “b1”, "_id"{ : "1", “NumComentarios” : 2} "BlogId" : "b1", "_id" : “2", "Titulo" : "foo", : "b2", { "BlogId" "Comentarios" : [ "_id" : “3", "Titulo" : “bar", { "BlogId" : "b2", "Comentarios" : [ "Autor" : "eiximenis","Titulo" : “bar", {“BlogId” : “b1”, { "Comentarios" : [ "Texto" : "...." : “pisukeman", “NumComentarios” :1} "Autor" }, { "Texto" : "...." { "Autor" : “bandolero", }] "Autor" : "eiximenis", "Texto" : "...." } {“BlogId” : “b2”, "Texto" : "...." }, “NumComentarios” :2} }] { } "Autor" : “pisukeman", "Texto" : "...." }] }
  • 14.
    … REDUCE {“BlogId” : “b1”, {“BlogId” : “b1”, “NumComentarios” : 3} “NumComentarios” : 2} {“BlogId” : “b1”, {“BlogId” : “b1”, “NumComentarios” :1} {“BlogId” : “b2”, “NumComentarios” : 12} {“BlogId” : “b2”, “NumComentarios” : 2} “NumComentarios” :2} {“BlogId” : “b1”, {“BlogId” : “b2”, “NumComentarios” :7} {“BlogId” : “b1”, “NumComentarios” : 2} {“BlogId” : “b2”, “NumComentarios” : 9} “NumComentarios” : 0} {“BlogId” : “b1”, {“BlogId” : “b2”, “NumComentarios” :2} “NumComentarios” : 0}
  • 15.
    MAP / REDUCEEN MONGODB {“_id” : “b1”, • 2 funciones (map y reduce) escritas en javascript [ • Ejecutadas en el servidor {“numcoments” : 2}, {“numcoments: 4} function() { ]} emit(this.BlogId, {numcoments : this.Comentarios.length}); } function(key, values) { var ret = {numcoments : 0}; {“_id” : “b1”, values.forEach(function(value) { “value” { ret.numcoments +=value.numcoments; “numcoments” : 6 }); } return ret; } }
  • 16.
    REPLICA SETS • Redundanciade datos • Tolerancia a fallos • Un primario, varios secundarios • Escrituras: Solo a/desde el primario • Lecturas: Solo desde el primario o bien desde cualquier nodo • Si el primario cae, un secundario toma su rol de forma automática