![](img/inovacoes.png)
![](img/inovacoes2.png)
## JSON ``` { "name": "MongoDB", "type": "DB", "tags": ["bson", "performance", "data richness"], "latest-version": { "major": 2, "minor": 4, "patch": 8 }, "schemaless": true } ```
## JSON ![](img/jsonobject.png) ![](img/jsonarray.png)
## JSON ![](img/jsonvalue.png)
## BSON ![](img/bson.png)
## 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
![](img/rdbms.png)
![](img/rdbms2.png)
![](img/rdbms3.png)
## Teorema CAP ![](img/cap2.png)
## 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 ``` 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 } }); ```
## 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" ```javascript posts = [{ _id: ObjectID("..."), title: "...", body: "...", author: "..." }] comments = [{ post_id: ObjectId("..."), name: "...", email: "...", body: "..." }] ```
## Schema design ### Embutido ```javascript posts = [{ title: "...", body: "...", author: "...", comments: [ { name: "...", email: "...", body: "..." }, { name: "...", email: "...", body: "..." } /*, ... */ ] }] ```
## Schema design ### Misto ```javascript posts = [{ _id: ObjectID("..."), title: "...", body: "...", author: "...", comments: [/* ... */] }] comments = [{ post_id: ObjectId("..."), name: "...", email: "...", body: "..." }] ```
# Perguntas?