## 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
## 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: "..."
}]
```