curso-introdutorio



curso-introdutorio

0 0


curso-introdutorio

Apresentação para um curso introdutório sobre MongoDB

On Github maceio-mug / curso-introdutorio

Conhecendo o MongoDB

Banco de dados orientado a documentos

Vilker e Vinícius

JSON

{
    "name": "MongoDB",
    "type": "DB",
    "tags": ["bson", "performance", "data richness"],
    "latest-version": {
        "major": 2,
        "minor": 4,
        "patch": 8
    },
    "schemaless": true
}

JSON

JSON

BSON

BSON vs JSON

  • Suporta mais tipos de dados
    • Formato de data
    • ObjectID
    • ...
  • Representação mais compacta

BSON vs outros

  • Otimizado para parse rápido
  • Minimiza interações com o HD

Relacional e MongoDB

Relacional MongoDB Banco de dados Banco de dados Tabela Coleção Linha Documento Coluna Campo/atributo JOIN *Não suporta Transação **Não suporta Agregação (GROUP BY) Framework de agregação, map-reduce, ...

*Documentos embutidos e referências **Uso avançado

Teorema CAP

Schemaless

Na coleção bandas:

[
    {
        "title": "Mozart Group",
        "desc": "A creative quartet group",
        "tags": "musica-classica"
    },
    {"title": "Angra"},
    {
        "title": "Calcinha Preta",
        "desc": "Famosa banda de forró brasileira",
        "tags": ["forro", "brasil"]
    }
]

Schemaless

O MongoDB trata, geralmente, a falta de atributos e um atributo com o valor null da mesma forma. Exceções (poucas):

  • $exists
  • $type
  • ...

Schemaless

No MongoDB, operadores de seleção (primeiro argumento do find) são usados de forma similar ou idêntica entre arrays e não-arrays.

Cuidado com os operadores de atualização!

Schemaless

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var blogSchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});

Schemaless

Schemaless

Outras considerações:

  • Fator de padding
  • Índices esparsos (hint({$natural: 1}))
  • ...

mongod

Inicia o processo do banco de dados, rodando na porta especificada e usando a pasta "/path/to/db/files" para salvar os arquivos.

mongod --port arg --dbpath /path/to/db/files

mongo

Abre o console JavaScript do MongoDB com uma conexão a $DBADDRESS e executa o script file.js.

mongo --shell $DBADDRESS file.js

Exemplos de endereços:

  • foo
  • 192.169.0.5/foo
  • 192.169.0.5:9999/foo

mongoimport

mongoimport --host myhost --db my_cms --collection docs < mydocfile.json

Base de exemplo: https://gist.github.com/anonymous/41d5da75f34768899e8b/raw/6b4e9888cc5bc216dc7b6abc82e48b69fd4a468f/pacman

Comandos CRUD

db.coll.insert(doc);
db.coll.insert([doc1, doc2]);

db.coll.find({idade: 15});
db.coll.find({"nome.primeiro": "Yotsuba"}, {idade: true, _id: false});

db.coll.find({idade: {$lt: 15}});
db.coll.find({idade: {$gt: 15, $lt: 40, $ne: 33}});

db.coll.remove({_id: ObjectId("52a3d4d243343277580dbe77")});

db.coll.update({nome: "Moot"}, {nome: "Moot", idade: 20}); // uncool
db.coll.update({nome: "Moot"}, {$set: {idade: 20}});
db.coll.update({cargo: "tester"}, {$inc: {salario: 200}}, {multi: true});

Cursores

Comando find() retorna um cursor, que pode possui alguns métodos interessantes. Ex.:

db.coll.find().sort({nota: -1, idade: 1}).skip(2).limit(10);

Schema design

Evite:

{"groups": {
    152: "hi",
    111: "group2"
}}

Prefira:

{"groups": [
    {"id": 152, "name": "hi"},
    {"id": 111, "name": "group2"}
]}

Schema design

Normalização (mundo relacional)

  • Livrar o banco de dados de anomalias de modificações
  • "Minimizar o redesign na hora de extender"
  • Evitar um viés para qualquer padrão de acesso (consulta) particular

Schema design

"Normalizado"

posts = [{
  _id: ObjectID("..."),
  title: "...",
  body: "...",
  author: "..."
}]

comments = [{
  post_id: ObjectId("..."),
  name: "...",
  email: "...",
  body: "..."
}]

Schema design

Embutido

posts = [{
  title: "...",
  body: "...",
  author: "...",
  comments: [
    {
      name: "...",
      email: "...",
      body: "..."
    },
    {
      name: "...",
      email: "...",
      body: "..."
    } /*, ... */
  ]
}]

Schema design

Misto

posts = [{
  _id: ObjectID("..."),
  title: "...",
  body: "...",
  author: "...",
  comments: [/* ... */]
}]

comments = [{
  post_id: ObjectId("..."),
  name: "...",
  email: "...",
  body: "..."
}]

Perguntas?