Você tem dado
em casa?
SQL
SQL
 Structured Query Language


SELECT * FROM * WHERE 1 = 1;
SQL
Apache Derby     PostgreSQL
Caché            InterBase
DB2              Microsoft Access
Firebird         Microsoft SQL Server
HSQLDB           MySQL
SQLite           Oracle
NoSQL
Jefferson Q. Venerando
NoSQL?
NoSQL
•Usado em 1998 como o nome de um BD
relacional open source sem interface SQL;
•“Completamente distinto do modelo
relacional”;
•Deveria ser chamado NoREL;
•Voltou a ser usado em 2009 em um evento
sobre banco de dados open source
distribuídos.
NoSQL


•Vieram para suprir necessidades dos BD
tradicionais;
•Alta performance, escalabilidade, replicação,
suporte à dados estruturados e sub colunas.
Escalability?

•Escalabilidade vertical (scale up)
  •Aumentar poder do servidor.


•Escalabilidade horizontal (scale out)
  •Aumentar quantidade de servidores.
NoSQL


•Informações necessárias agrupadas no
mesmo registro;
•Sem relacionamentos =)
NoSQL

•Existem vários tipos;
•São divididos pela forma usada para trabalhar
com seus dados:
  •Wide column store
  •Key/value store
  •Graph store
  •Column oriented store
  •Document store
NoSQL
            Wide column store

•Fortemente inspirados pelo BigTable do
google, suportam várias linhas e colunas além
de subcolunas.
•Outros exemplos:
 •HBase (Yahoo)
 •HiperTable
 •Cassandra (Facebook e Digg)
NoSQL
              Key/value store

•Mais simples, chave e valor para a chave.
•Agüenta mais carga de dados.
•São os mais escaláveis.
•Exemplos:
  •MemcacheDB
  •SimpleBD
  •Berkeley DB
NoSQL
               Graph store
•Mais complexo.
•Guarda objeto e não registros.
•Buscas são feitas pela navegação destes
objetos.
•Exemplos:
  •Neo4J
  •InfoGrid
  •BigData
NoSQL
          Column oriented store
•São relacionais.
•Tem características do NoSQL.
•Dados armazenados em colunas, não em
linhas.
•Exemplos:
  •Vertica
  •MonetDB
  •LucidDB
NoSQL
        Document oriented store

•Baseados em documentos XML ou JSON.
•Localização por ID único ou qualquer registro
do documento.
•Exemplos:
  •CouchDB (Apache)
  •MongoDB (Engine Yard)
  •Riak
Wood in the cat
Manga?
MongoDB
        Orientado a Documentos

•Modelo relacional: representa mundo real (que
é n-dimensional) usando abordagem
bidimensional.
•Podemos melhorar isso com análise, mas
posteriormente um outro atributo pode ser
encontrado.
MongoDB


•O equivalente a registros são documentos.
•Sintaxe JSON.
JASON?
JSON - JavaScript Object Notation

Nele = {
  nome:"Elen Carla D. O.",
  cidade:"Indiaporã",
  pensamento:"Vou matar alguém depois
dessa palestra."
}



                             Mimimi...
Nele = {
  nome:"Elen Carla D. O.",
  cidade:"Indiaporã",
  pensamento:"Vou matar alguém depois
dessa palestra."
}
db.testedb.save(Nele)
Boer = {
  nome:"Marcelo Tadeu-deu-deu Boer",
  disciplinas: {
     {
        nome:"APS",
        semestre:{4, 5, 6}
     },
     {
        nome:"LTP",
        semestre:5
     }
  },
  faculdade:"FEF"
}

db.testedb.save(Boer)
Eae?

•Representamos objetos do mundo real da
forma como eles são: complexos e únicos. =)
•Se precisar de novos atributos, eles serão
criados apenas onde for necessário. =)


•Desenvolvedor precisa tomar cuidado pro
banco não virar a casa da mãe Joana. =(
Redundância de dados over 9000



•Modelo relacional: Reduzir o máximo possível
a redundância de dados(formas normais,
relacionamentos).
•MongoDB: Sem relacionamentos, duplicação
não é um problema.
RedunZzzZZzZz...
pessoa1 = {nome:"João", cidade:{nome:"Belo Horizonte",
estado:"MG"}}

pessoa2 = {nome:"Zequinha", cidade:{nome:"Belo Horizonte",
estado: "MG"}}

pessoa3 = {nome:"Joca", cidade:"Lagoa Santa"}

pessoa4 = {nome:"Jurema", cidade:{nome:"Rio de Janeiro",
estado:{nome:"Rio de Janeiro", pais:{nome:"Brasil"}}}
Redundância de dados over 9000


•Não há tabelas: há coleções de documentos.
•O documento é meu e eu guardo o que eu
quiser nele.

•Documentos devem ser auto-contidos.
•Uma única consulta retorna o documento
inteiro.
Então?


•Mais performance. Uma consulta retorna tudo
o que precisa a respeito do documento. =)


•Alterar todos registros relacionados a uma
unidade semântica requer tratamento um a um.
Na prática...
Database == Database
> show dbs
    admin
    bsp_development
    local
> use bsp_development
    switched to db bsp_development
> show collections
    clientes
    fornecedores
    funcionarios
    servicos
    system.indexes
Coleção == Tabela
> db.clientes
bsp_development.clientes

> db.clientes.count()
5

> db.clientes.find().forEach(function(doc) {
  print(tojson(doc));
});
Documento == Linha
{
  "_id" : ObjectId("4cee87ac271cd3146e00002a"),
  "ativo" : true,
  "nome" : "Ryu",
  "email" : "ryuhadouken@shamanime.com",
  "poder_especial" : "hadouken",
  "created_at" : "Thu Nov 25 2010 13:58:36 GMT-0200
(BRST)",
  "updated_at" : "Thu Nov 25 2010 13:58:36 GMT-0200
(BRST)",
}
Funcionalidades similares

    Consultas dinâmicas
> use teste
switched to db teste
> db.cores.insert({nome:'vermelho',   primaria:true})
> db.cores.insert({nome:'verde',      primaria:true})
> db.cores.insert({nome:'azul',       primaria:true})
> db.cores.insert({nome:'rosa',       primaria:false})
> db.cores.insert({nome:'amarelo',    primaria:false})
> db.cores.insert({nome:'laranja',    primaria:false})
> var cursor = db.cores.find()
> cursor.next()
{
  "_id" : ObjectId("4d56e8d3e0ab4d700255d829"),
  "nome" : "vermelho",
  "primaria" : true
}
> cursor
{   "_id"   :   ObjectId("4d56e8e6e0ab4d700255d82a"),   "nome"   :   "verde",     "primaria"   :   true }
{   "_id"   :   ObjectId("4d56e8ede0ab4d700255d82b"),   "nome"   :   "azul",      "primaria"   :   true }
{   "_id"   :   ObjectId("4d56e8f6e0ab4d700255d82c"),   "nome"   :   "rosa",      "primaria"   :   false }
{   "_id"   :   ObjectId("4d56e8fce0ab4d700255d82d"),   "nome"   :   "amarelo",   "primaria"   :   false }
{ "_id" : ObjectId("4d56e903e0ab4d700255d82e"), "nome" : "laranja", "primaria" : false }
SELECT * FROM cores WHERE nome = 'verde';

> db.cores.find({nome:'verde'})
{ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
SELECT nome FROM cores WHERE primaria = 1;

> db.cores.find({primaria:true}, {nome:true})
{ "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho" }
{ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde" }
{ "_id" : ObjectId("4d56e8ede0ab4d700255d82b"), "nome" : "azul" }
> db.cores.find({nome:/l/})
{   "_id"   :   ObjectId("4d56e8d3e0ab4d700255d829"),   "nome"   :   "vermelho", "primaria" : true }
{   "_id"   :   ObjectId("4d56e8ede0ab4d700255d82b"),   "nome"   :   "azul", "primaria" : true }
{   "_id"   :   ObjectId("4d56e8fce0ab4d700255d82d"),   "nome"   :   "amarelo", "primaria" : false }
{   "_id"   :   ObjectId("4d56e903e0ab4d700255d82e"),   "nome"   :   "laranja", "primaria" : false }
> db.pessoas.insert({nome:"Boer",      idade:28})
> db.pessoas.insert({nome:"Tiago",     idade:24})
> db.pessoas.insert({nome:"Guilherme", idade:39})
SELECT * FROM pessoas WHERE idade > 24

> db.pessoas.find({idade: {$gt: 24}})
{ "_id" : ObjectId("4d594916e0ab4d700255d82f"), "nome" : "Boer", "idade" : 28 }
{ "_id" : ObjectId("4d59492ae0ab4d700255d831"), "nome" : "Guilherme", "idade" : 39 }
SELECT * FROM pessoas WHERE idade <= 24

> db.pessoas.find({idade: {$lte: 24}})
{ "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
$bot_add
                      $bot_kick
$bot_add_ct
                      $bot_kick x
$bot_add_tr
                      $bot_knives only
$bot_kill
                      $bot_pistols_only
$bot_difficulty   0
                      $bot_snipers_only
$bot_difficulty   2
                      $bot_all_weapons
$bot_difficulty   3
                      $bot_allow_shield x
$bot_difficulty   4
$gt
       $all
$gte
       $size
$lt
       $exists
$lte
       $type
$ne
       $elemMatch
$in
       $not
$nin
       $where
$mod
Funcionalidades similares

        Agregação
> db.cores.count()
6
> db.cores.count({primaria:true})
3
> db.cores.distinct('nome')
[ "amarelo", "azul", "laranja", "rosa", "verde", "vermelho" ]


> db.pessoas.distinct('nome', {idade:24})
[ "Tiago" ]
>   db.itens.insert({titulo:'Home',               template:'home'})
>   db.itens.insert({titulo:'O que fazemos',      template:'pagina'})
>   db.itens.insert({titulo:'Quem somos',         template:'pagina'})
>   db.itens.insert({titulo:'Trabalhe conosco',   template:'pagina'})
>   db.itens.insert({titulo:'Nossos valores',     template:'pagina'})

> var key = {template: true};
> var inicial = {count:0};
> var reduce = function(obj, prev) {prev.count += 1;};

> db.itens.group({key:key, initial:inicial, reduce:reduce})
[
  {"template" : "home",   "count" : 1},
  {"template" : "pagina", "count" : 4}
]
>   db.itens.insert({tags:   ['cachorro', 'gato']})
>   db.itens.insert({tags:   ['cachorro']})
>   db.itens.insert({tags:   ['cachorro', 'rato']})
>   db.itens.insert({tags:   ['cachorro', 'rato', 'macaco']})
>   db.itens.insert({tags:   ['cachorro', 'rato', 'macaco']})
>   db.itens.insert({tags:   ['cachorro', 'macaco']})
GROUP BY = MapReduce


> var map = function() {
    this.tags.forEach(function(t) {
      emit(t, {count: 1});
    });
  }
GROUP BY = MapReduce

> var reduce = function(key, values) {
    var count = 0;
    for(var i=0, len=values.lenght; i<len; i++) {
      count += values[i].count;
    }
    return {count: count};
  }
GROUP BY = MapReduce

> var result = db.itens.mapReduce(map, reduce);
> result
{
  "ok"          : 1,
  "timeMillis" : 86,
  "result"      : "tmp.mr.mapreduce_1273861517_683",
  "counts"      : {
    "input"     : 6,
    "emit"      : 13,
    "output"    : 4
  }
}
GROUP BY = MapReduce


>   db[result.result].find()
{   "_id" : "cachorro", "value"   :   {   "count"   :   6   }   }
{   "_id" : "gato",     "value"   :   {   "count"   :   1   }   }
{   "_id" : "macaco",   "value"   :   {   "count"   :   3   }   }
{   "_id" : "rato",     "value"   :   {   "count"   :   3   }   }
Funcionalidades similares

     Relacionamentos
Relacionamentos

 Um para Muitos
1. Normalizado
// inserir post
> db.posts.insert({titulo:'Analise e Projeto de Sistemas'});
> var post = db.posts.findOne({titulo:'Analise e Projeto de
Sistemas'});

// inserir comentario
> db.comentarios.insert({
  nome:'Jefferson',
  corpo:'Awo Boer, meu rei!',
  post_id : post._id
});
> var comentario = db.comentarios.findOne({nome:'Jefferson'});
SELECT * FROM comentarios WHERE post_id = {#post.id}

> db.comentarios.find({post_id: post._id})
{
  "_id" : ObjectId("4d5955f1e0ab4d700255d83e"),
  "nome" : "Jefferson",
  "corpo" : "Awo Boer, meu rei!",
  "post_id" : ObjectId("4d5955a5e0ab4d700255d83d")
}
SELECT * FROM posts WHERE id = {#comentario.id}

> db.posts.find({_id: comentario.post_id})
{
  "_id" : ObjectId("4d5955a5e0ab4d700255d83d"),
  "titulo" : "Analise e Projeto de Sistemas"
}
2. Embedded
// inserir post E comentarios
> db.posts.insert({
   titulo: 'Analise e Projeto de Sistemas',
   comentarios: [
     nome: 'Jefferson', corpo: 'Haha, passei!'},
     nome: 'Diego', corpo: 'Da meio ponto ai, Boer!'}
   ]
})
> var post = db.posts.find({titulo:'Analise e Projeto de Sistemas'});
> post
{
  "_id" : ObjectId("4d5957e7e0ab4d700255d83f"),
  "titulo" : "Analise e Projeto de Sistemas",
  "comentarios" : [
    {"nome" : "Jefferson", "corpo" : "Haha, passei!"},
    {"nome" : "Diego", "corpo" : "Da meio ponto ai,
Boer!"}
  ]
}
> db.posts.find({'comentarios.nome':'Diego'})
> db.posts.find({
   comentarios: {
     $elemMatch: {nome:'Diego'}
   }
})
// inserir posts, comentários e respostas
> db.posts.insert({
   titulo:'LTP',
   comentarios: [
     {
       nome:'Jefferson',
       corpo:'MVC neles Tiaguinho!',
       comentarios: [
         {nome:'Elen', corpo:'Não to entendendo nada.'},
         {nome:'Jefferson', corpo:'Para de chorar!'}
       ]
     }
   ]
})
> db.posts.insert({
   titulo: 'MongoDB',
   tags : ['mongodb', 'databases']
})
> db.posts.ensureIndex({tags:1})
Relacionamentos

Muitos para Muitos
> db.sites.insert({dominio: 'shamanime.com'})
> db.sites.insert({dominio: 'brassun.com.br'})
> db.sites.find()
{
  "_id" : ObjectId("4d595b58e0ab4d700255d841"),
  "dominio" : "shamanime.com"
}
{
  "_id" : ObjectId("4d595b62e0ab4d700255d842"),
  "dominio" : "brassun.com.br"
}
> db.usuarios.insert({
   nome: 'Jefferson',
   autorizacoes: [
     ObjectId('4d595b58e0ab4d700255d841'),
     ObjectId('4d595b62e0ab4d700255d842')
   ]
})

> db.usuarios.insert({
   nome: 'Lucio',
   autorizacoes: [
     ObjectId('4d595b62e0ab4d700255d842')
   ]
})
> var bs = db.sites.findOne({dominio:'brassun.com.br'})
> db.usuarios.find({autorizacoes:bs._id})
// Jefferson e Lucio

> var shamanime = db.sites.findOne({dominio:'shamanime.com'})
> db.usuarios.find({autorizacoes:shamanime._id})
// Jefferson
> var jefferson = db.usuarios.findOne({nome:'Jefferson'})
> db.sites.find({_id:{$in: jefferson.autorizacoes}})
// shamanime.com e brassun.com.br
Check list:

•SQL
•NoSQL
•Escalabilidade
•MongoDB: Insert, consultas,
agregação, relacionamentos
•MongoDB: Update, delete, etc
Teste você mesmo:

http://try.mongodb.org/
Antes que eu me esqueça:
           GridFS
  •Armazenar arquivos no banco de dados.
  •Qualquer tipo.
  •GridFS + Replicação + Sharding = WIN!
nosqlsummer.org
{
    nome:      'Jefferson Venerando',
    site:      'shamanime.com'
    twitter:   '@shamanime'
    empresa:   'brassun.com.br'
}

NoSQL e MongoDB - ETEC

  • 1.
  • 3.
  • 4.
    SQL Structured QueryLanguage SELECT * FROM * WHERE 1 = 1;
  • 5.
    SQL Apache Derby PostgreSQL Caché InterBase DB2 Microsoft Access Firebird Microsoft SQL Server HSQLDB MySQL SQLite Oracle
  • 6.
  • 8.
  • 9.
    NoSQL •Usado em 1998como o nome de um BD relacional open source sem interface SQL; •“Completamente distinto do modelo relacional”; •Deveria ser chamado NoREL; •Voltou a ser usado em 2009 em um evento sobre banco de dados open source distribuídos.
  • 10.
    NoSQL •Vieram para suprirnecessidades dos BD tradicionais; •Alta performance, escalabilidade, replicação, suporte à dados estruturados e sub colunas.
  • 11.
    Escalability? •Escalabilidade vertical (scaleup) •Aumentar poder do servidor. •Escalabilidade horizontal (scale out) •Aumentar quantidade de servidores.
  • 12.
    NoSQL •Informações necessárias agrupadasno mesmo registro; •Sem relacionamentos =)
  • 13.
    NoSQL •Existem vários tipos; •Sãodivididos pela forma usada para trabalhar com seus dados: •Wide column store •Key/value store •Graph store •Column oriented store •Document store
  • 14.
    NoSQL Wide column store •Fortemente inspirados pelo BigTable do google, suportam várias linhas e colunas além de subcolunas. •Outros exemplos: •HBase (Yahoo) •HiperTable •Cassandra (Facebook e Digg)
  • 15.
    NoSQL Key/value store •Mais simples, chave e valor para a chave. •Agüenta mais carga de dados. •São os mais escaláveis. •Exemplos: •MemcacheDB •SimpleBD •Berkeley DB
  • 16.
    NoSQL Graph store •Mais complexo. •Guarda objeto e não registros. •Buscas são feitas pela navegação destes objetos. •Exemplos: •Neo4J •InfoGrid •BigData
  • 17.
    NoSQL Column oriented store •São relacionais. •Tem características do NoSQL. •Dados armazenados em colunas, não em linhas. •Exemplos: •Vertica •MonetDB •LucidDB
  • 18.
    NoSQL Document oriented store •Baseados em documentos XML ou JSON. •Localização por ID único ou qualquer registro do documento. •Exemplos: •CouchDB (Apache) •MongoDB (Engine Yard) •Riak
  • 19.
  • 20.
  • 21.
    MongoDB Orientado a Documentos •Modelo relacional: representa mundo real (que é n-dimensional) usando abordagem bidimensional. •Podemos melhorar isso com análise, mas posteriormente um outro atributo pode ser encontrado.
  • 22.
    MongoDB •O equivalente aregistros são documentos. •Sintaxe JSON.
  • 23.
  • 24.
    JSON - JavaScriptObject Notation Nele = { nome:"Elen Carla D. O.", cidade:"Indiaporã", pensamento:"Vou matar alguém depois dessa palestra." } Mimimi...
  • 25.
    Nele = { nome:"Elen Carla D. O.", cidade:"Indiaporã", pensamento:"Vou matar alguém depois dessa palestra." } db.testedb.save(Nele)
  • 26.
    Boer = { nome:"Marcelo Tadeu-deu-deu Boer", disciplinas: { { nome:"APS", semestre:{4, 5, 6} }, { nome:"LTP", semestre:5 } }, faculdade:"FEF" } db.testedb.save(Boer)
  • 27.
    Eae? •Representamos objetos domundo real da forma como eles são: complexos e únicos. =) •Se precisar de novos atributos, eles serão criados apenas onde for necessário. =) •Desenvolvedor precisa tomar cuidado pro banco não virar a casa da mãe Joana. =(
  • 28.
    Redundância de dadosover 9000 •Modelo relacional: Reduzir o máximo possível a redundância de dados(formas normais, relacionamentos). •MongoDB: Sem relacionamentos, duplicação não é um problema.
  • 29.
    RedunZzzZZzZz... pessoa1 = {nome:"João",cidade:{nome:"Belo Horizonte", estado:"MG"}} pessoa2 = {nome:"Zequinha", cidade:{nome:"Belo Horizonte", estado: "MG"}} pessoa3 = {nome:"Joca", cidade:"Lagoa Santa"} pessoa4 = {nome:"Jurema", cidade:{nome:"Rio de Janeiro", estado:{nome:"Rio de Janeiro", pais:{nome:"Brasil"}}}
  • 30.
    Redundância de dadosover 9000 •Não há tabelas: há coleções de documentos. •O documento é meu e eu guardo o que eu quiser nele. •Documentos devem ser auto-contidos. •Uma única consulta retorna o documento inteiro.
  • 31.
    Então? •Mais performance. Umaconsulta retorna tudo o que precisa a respeito do documento. =) •Alterar todos registros relacionados a uma unidade semântica requer tratamento um a um.
  • 32.
  • 33.
  • 34.
    > show dbs admin bsp_development local > use bsp_development switched to db bsp_development > show collections clientes fornecedores funcionarios servicos system.indexes
  • 35.
  • 36.
    > db.clientes bsp_development.clientes > db.clientes.count() 5 >db.clientes.find().forEach(function(doc) { print(tojson(doc)); });
  • 37.
  • 38.
    { "_id": ObjectId("4cee87ac271cd3146e00002a"), "ativo" : true, "nome" : "Ryu", "email" : "ryuhadouken@shamanime.com", "poder_especial" : "hadouken", "created_at" : "Thu Nov 25 2010 13:58:36 GMT-0200 (BRST)", "updated_at" : "Thu Nov 25 2010 13:58:36 GMT-0200 (BRST)", }
  • 40.
    Funcionalidades similares Consultas dinâmicas
  • 41.
    > use teste switchedto db teste > db.cores.insert({nome:'vermelho', primaria:true}) > db.cores.insert({nome:'verde', primaria:true}) > db.cores.insert({nome:'azul', primaria:true}) > db.cores.insert({nome:'rosa', primaria:false}) > db.cores.insert({nome:'amarelo', primaria:false}) > db.cores.insert({nome:'laranja', primaria:false})
  • 42.
    > var cursor= db.cores.find() > cursor.next() { "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true }
  • 43.
    > cursor { "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true } { "_id" : ObjectId("4d56e8ede0ab4d700255d82b"), "nome" : "azul", "primaria" : true } { "_id" : ObjectId("4d56e8f6e0ab4d700255d82c"), "nome" : "rosa", "primaria" : false } { "_id" : ObjectId("4d56e8fce0ab4d700255d82d"), "nome" : "amarelo", "primaria" : false } { "_id" : ObjectId("4d56e903e0ab4d700255d82e"), "nome" : "laranja", "primaria" : false }
  • 44.
    SELECT * FROMcores WHERE nome = 'verde'; > db.cores.find({nome:'verde'}) { "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
  • 45.
    SELECT nome FROMcores WHERE primaria = 1; > db.cores.find({primaria:true}, {nome:true}) { "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho" } { "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde" } { "_id" : ObjectId("4d56e8ede0ab4d700255d82b"), "nome" : "azul" }
  • 46.
    > db.cores.find({nome:/l/}) { "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true } { "_id" : ObjectId("4d56e8ede0ab4d700255d82b"), "nome" : "azul", "primaria" : true } { "_id" : ObjectId("4d56e8fce0ab4d700255d82d"), "nome" : "amarelo", "primaria" : false } { "_id" : ObjectId("4d56e903e0ab4d700255d82e"), "nome" : "laranja", "primaria" : false }
  • 47.
    > db.pessoas.insert({nome:"Boer", idade:28}) > db.pessoas.insert({nome:"Tiago", idade:24}) > db.pessoas.insert({nome:"Guilherme", idade:39})
  • 48.
    SELECT * FROMpessoas WHERE idade > 24 > db.pessoas.find({idade: {$gt: 24}}) { "_id" : ObjectId("4d594916e0ab4d700255d82f"), "nome" : "Boer", "idade" : 28 } { "_id" : ObjectId("4d59492ae0ab4d700255d831"), "nome" : "Guilherme", "idade" : 39 }
  • 49.
    SELECT * FROMpessoas WHERE idade <= 24 > db.pessoas.find({idade: {$lte: 24}}) { "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
  • 50.
    $bot_add $bot_kick $bot_add_ct $bot_kick x $bot_add_tr $bot_knives only $bot_kill $bot_pistols_only $bot_difficulty 0 $bot_snipers_only $bot_difficulty 2 $bot_all_weapons $bot_difficulty 3 $bot_allow_shield x $bot_difficulty 4
  • 51.
    $gt $all $gte $size $lt $exists $lte $type $ne $elemMatch $in $not $nin $where $mod
  • 52.
  • 53.
  • 54.
    > db.cores.distinct('nome') [ "amarelo","azul", "laranja", "rosa", "verde", "vermelho" ] > db.pessoas.distinct('nome', {idade:24}) [ "Tiago" ]
  • 55.
    > db.itens.insert({titulo:'Home', template:'home'}) > db.itens.insert({titulo:'O que fazemos', template:'pagina'}) > db.itens.insert({titulo:'Quem somos', template:'pagina'}) > db.itens.insert({titulo:'Trabalhe conosco', template:'pagina'}) > db.itens.insert({titulo:'Nossos valores', template:'pagina'}) > var key = {template: true}; > var inicial = {count:0}; > var reduce = function(obj, prev) {prev.count += 1;}; > db.itens.group({key:key, initial:inicial, reduce:reduce}) [ {"template" : "home", "count" : 1}, {"template" : "pagina", "count" : 4} ]
  • 56.
    > db.itens.insert({tags: ['cachorro', 'gato']}) > db.itens.insert({tags: ['cachorro']}) > db.itens.insert({tags: ['cachorro', 'rato']}) > db.itens.insert({tags: ['cachorro', 'rato', 'macaco']}) > db.itens.insert({tags: ['cachorro', 'rato', 'macaco']}) > db.itens.insert({tags: ['cachorro', 'macaco']})
  • 57.
    GROUP BY =MapReduce > var map = function() { this.tags.forEach(function(t) { emit(t, {count: 1}); }); }
  • 58.
    GROUP BY =MapReduce > var reduce = function(key, values) { var count = 0; for(var i=0, len=values.lenght; i<len; i++) { count += values[i].count; } return {count: count}; }
  • 59.
    GROUP BY =MapReduce > var result = db.itens.mapReduce(map, reduce); > result { "ok" : 1, "timeMillis" : 86, "result" : "tmp.mr.mapreduce_1273861517_683", "counts" : { "input" : 6, "emit" : 13, "output" : 4 } }
  • 60.
    GROUP BY =MapReduce > db[result.result].find() { "_id" : "cachorro", "value" : { "count" : 6 } } { "_id" : "gato", "value" : { "count" : 1 } } { "_id" : "macaco", "value" : { "count" : 3 } } { "_id" : "rato", "value" : { "count" : 3 } }
  • 61.
  • 62.
  • 63.
  • 64.
    // inserir post >db.posts.insert({titulo:'Analise e Projeto de Sistemas'}); > var post = db.posts.findOne({titulo:'Analise e Projeto de Sistemas'}); // inserir comentario > db.comentarios.insert({ nome:'Jefferson', corpo:'Awo Boer, meu rei!', post_id : post._id }); > var comentario = db.comentarios.findOne({nome:'Jefferson'});
  • 65.
    SELECT * FROMcomentarios WHERE post_id = {#post.id} > db.comentarios.find({post_id: post._id}) { "_id" : ObjectId("4d5955f1e0ab4d700255d83e"), "nome" : "Jefferson", "corpo" : "Awo Boer, meu rei!", "post_id" : ObjectId("4d5955a5e0ab4d700255d83d") }
  • 66.
    SELECT * FROMposts WHERE id = {#comentario.id} > db.posts.find({_id: comentario.post_id}) { "_id" : ObjectId("4d5955a5e0ab4d700255d83d"), "titulo" : "Analise e Projeto de Sistemas" }
  • 67.
  • 68.
    // inserir postE comentarios > db.posts.insert({ titulo: 'Analise e Projeto de Sistemas', comentarios: [ nome: 'Jefferson', corpo: 'Haha, passei!'}, nome: 'Diego', corpo: 'Da meio ponto ai, Boer!'} ] })
  • 69.
    > var post= db.posts.find({titulo:'Analise e Projeto de Sistemas'}); > post { "_id" : ObjectId("4d5957e7e0ab4d700255d83f"), "titulo" : "Analise e Projeto de Sistemas", "comentarios" : [ {"nome" : "Jefferson", "corpo" : "Haha, passei!"}, {"nome" : "Diego", "corpo" : "Da meio ponto ai, Boer!"} ] }
  • 70.
    > db.posts.find({'comentarios.nome':'Diego'}) > db.posts.find({ comentarios: { $elemMatch: {nome:'Diego'} } })
  • 71.
    // inserir posts,comentários e respostas > db.posts.insert({ titulo:'LTP', comentarios: [ { nome:'Jefferson', corpo:'MVC neles Tiaguinho!', comentarios: [ {nome:'Elen', corpo:'Não to entendendo nada.'}, {nome:'Jefferson', corpo:'Para de chorar!'} ] } ] })
  • 72.
    > db.posts.insert({ titulo: 'MongoDB', tags : ['mongodb', 'databases'] }) > db.posts.ensureIndex({tags:1})
  • 73.
  • 74.
    > db.sites.insert({dominio: 'shamanime.com'}) >db.sites.insert({dominio: 'brassun.com.br'}) > db.sites.find() { "_id" : ObjectId("4d595b58e0ab4d700255d841"), "dominio" : "shamanime.com" } { "_id" : ObjectId("4d595b62e0ab4d700255d842"), "dominio" : "brassun.com.br" }
  • 75.
    > db.usuarios.insert({ nome: 'Jefferson', autorizacoes: [ ObjectId('4d595b58e0ab4d700255d841'), ObjectId('4d595b62e0ab4d700255d842') ] }) > db.usuarios.insert({ nome: 'Lucio', autorizacoes: [ ObjectId('4d595b62e0ab4d700255d842') ] })
  • 76.
    > var bs= db.sites.findOne({dominio:'brassun.com.br'}) > db.usuarios.find({autorizacoes:bs._id}) // Jefferson e Lucio > var shamanime = db.sites.findOne({dominio:'shamanime.com'}) > db.usuarios.find({autorizacoes:shamanime._id}) // Jefferson
  • 77.
    > var jefferson= db.usuarios.findOne({nome:'Jefferson'}) > db.sites.find({_id:{$in: jefferson.autorizacoes}}) // shamanime.com e brassun.com.br
  • 78.
    Check list: •SQL •NoSQL •Escalabilidade •MongoDB: Insert,consultas, agregação, relacionamentos •MongoDB: Update, delete, etc
  • 79.
  • 80.
    Antes que eume esqueça: GridFS •Armazenar arquivos no banco de dados. •Qualquer tipo. •GridFS + Replicação + Sharding = WIN!
  • 81.
  • 83.
    { nome: 'Jefferson Venerando', site: 'shamanime.com' twitter: '@shamanime' empresa: 'brassun.com.br' }