Você tem dadoem casa?
SQL
SQL Structured Query LanguageSELECT * FROM * WHERE 1 = 1;
SQLApache Derby     PostgreSQLCaché            InterBaseDB2              Microsoft AccessFirebird         Microsoft SQL Se...
NoSQLJefferson Q. Venerando
NoSQL?
NoSQL•Usado em 1998 como o nome de um BDrelacional open source sem interface SQL;•“Completamente distinto do modelorelacio...
NoSQL•Vieram para suprir necessidades dos BDtradicionais;•Alta performance, escalabilidade, replicação,suporte à dados est...
Escalability?•Escalabilidade vertical (scale up)  •Aumentar poder do servidor.•Escalabilidade horizontal (scale out)  •Aum...
NoSQL•Informações necessárias agrupadas nomesmo registro;•Sem relacionamentos =)
NoSQL•Existem vários tipos;•São divididos pela forma usada para trabalharcom seus dados:  •Wide column store  •Key/value s...
NoSQL            Wide column store•Fortemente inspirados pelo BigTable dogoogle, suportam várias linhas e colunas alémde s...
NoSQL              Key/value store•Mais simples, chave e valor para a chave.•Agüenta mais carga de dados.•São os mais esca...
NoSQL               Graph store•Mais complexo.•Guarda objeto e não registros.•Buscas são feitas pela navegação destesobjet...
NoSQL          Column oriented store•São relacionais.•Tem características do NoSQL.•Dados armazenados em colunas, não emli...
NoSQL        Document oriented store•Baseados em documentos XML ou JSON.•Localização por ID único ou qualquer registrodo d...
Wood in the cat
Manga?
MongoDB        Orientado a Documentos•Modelo relacional: representa mundo real (queé n-dimensional) usando abordagembidime...
MongoDB•O equivalente a registros são documentos.•Sintaxe JSON.
JASON?
JSON - JavaScript Object NotationJefferson = {  nome:"Jefferson Queiroz Venerando",  apelido:"Shaman",  cidade:"Iturama"}
Jefferson = {  nome:"Jefferson Queiroz Venerando",  apelido:"Shaman",  cidade:"Iturama"}db.testedb.save(Jefferson)
Boer = {  nome:"Marcelo Tadeu Boer",  disciplinas: {     {        nome:"APS",        semestre:{4, 5, 6}     },     {      ...
Eae?•Representamos objetos do mundo real daforma como eles são: complexos e únicos. =)•Se precisar de novos atributos, ele...
Redundância de dados over 9000•Modelo relacional: Reduzir o máximo possívela redundância de dados(formas normais,relaciona...
RedunZzzZZzZz...pessoa1 = {nome:"João", cidade:{nome:"Belo Horizonte",estado:"MG"}}pessoa2 = {nome:"Zequinha", cidade:{nom...
Redundância de dados over 9000•Não há tabelas: há coleções de documentos.•O documento é meu e eu guardo o que euquiser nel...
Então?•Mais performance. Uma consulta retorna tudoo que precisa a respeito do documento. =)•Alterar todos registros relaci...
Na prática...
Database == Database
> show dbs    admin    bsp_development    local> use bsp_development    switched to db bsp_development> show collections  ...
Coleção == Tabela
> db.clientesbsp_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",...
Funcionalidades similares    Consultas dinâmicas
> use testeswitched to db teste> db.cores.insert({nome:vermelho,   primaria:true})> db.cores.insert({nome:verde,      prim...
> var cursor = db.cores.find()> cursor.next(){  "_id" : ObjectId("4d56e8d3e0ab4d700255d829"),  "nome" : "vermelho",  "prim...
> cursor{   "_id"   :   ObjectId("4d56e8e6e0ab4d700255d82a"),   "nome"   :   "verde",     "primaria"   :   true }{   "_id"...
SELECT * FROM cores WHERE nome = verde;> db.cores.find({nome:verde}){ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome"...
SELECT nome FROM cores WHERE primaria = 1;> db.cores.find({primaria:true}, {nome:true}){ "_id" : ObjectId("4d56e8d3e0ab4d7...
> db.cores.find({nome:/l/}){   "_id"   :   ObjectId("4d56e8d3e0ab4d700255d829"),   "nome"   :   "vermelho", "primaria" : t...
> db.pessoas.insert({nome:"Boer",      idade:28})> db.pessoas.insert({nome:"Tiago",     idade:24})> db.pessoas.insert({nom...
SELECT * FROM pessoas WHERE idade > 24> db.pessoas.find({idade: {$gt: 24}}){ "_id" : ObjectId("4d594916e0ab4d700255d82f"),...
SELECT * FROM pessoas WHERE idade <= 24> db.pessoas.find({idade: {$lte: 24}}){ "_id" : ObjectId("4d59491ee0ab4d700255d830"...
$bot_add                      $bot_kick$bot_add_ct                      $bot_kick x$bot_add_tr                      $bot_k...
$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:2...
>   db.itens.insert({titulo:Home,               template:home})>   db.itens.insert({titulo:O que fazemos,      template:pa...
>   db.itens.insert({tags:   [cachorro, gato]})>   db.itens.insert({tags:   [cachorro]})>   db.itens.insert({tags:   [cach...
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++...
GROUP BY = MapReduce> var result = db.itens.mapReduce(map, reduce);> result{  "ok"          : 1,  "timeMillis" : 86,  "res...
GROUP BY = MapReduce>   db[result.result].find(){   "_id" : "cachorro", "value"   :   {   "count"   :   6   }   }{   "_id"...
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 P...
SELECT * FROM comentarios WHERE post_id = {#post.id}> db.comentarios.find({post_id: post._id}){  "_id" : ObjectId("4d5955f...
SELECT * FROM posts WHERE id = {#comentario.id}> db.posts.find({_id: comentario.post_id}){  "_id" : ObjectId("4d5955a5e0ab...
2. Embedded
// inserir post E comentarios> db.posts.insert({   titulo: Analise e Projeto de Sistemas,   comentarios: [     nome: Jeffe...
> var post = db.posts.find({titulo:Analise e Projeto de Sistemas});> post{  "_id" : ObjectId("4d5957e7e0ab4d700255d83f"), ...
> db.posts.find({comentarios.nome:Diego})> db.posts.find({   comentarios: {     $elemMatch: {nome:Diego}   }})
// inserir posts, comentários e respostas> db.posts.insert({   titulo:APS,   comentarios: [     {       nome:Jefferson,   ...
> db.posts.insert({   titulo: MongoDB,   tags : [mongodb, databases]})> db.posts.ensureIndex({tags:1})
RelacionamentosMuitos para Muitos
> db.sites.insert({dominio: shamanime.com})> db.sites.insert({dominio: fef.br})> db.sites.find(){  "_id" : ObjectId("4d595...
> db.usuarios.insert({   nome: Jefferson,   autorizacoes: [     ObjectId(4d595b58e0ab4d700255d841),     ObjectId(4d595b62e...
> var fef = db.sites.findOne({dominio:fef.br})> db.usuarios.find({autorizacoes:fef._id})// Jefferson e Frederico> var sham...
> var jefferson = db.usuarios.findOne({nome:Jefferson})> db.sites.find({_id:{$in: jefferson.autorizacoes}})// shamanime.co...
Check list:•SQL•NoSQL•Escalabilidade•MongoDB: Insert, consultas,agregação, relacionamentos•MongoDB: Update, delete, etc
Teste você mesmo:http://try.mongodb.org/
{                  nome:       Jefferson Venerando,                  site:       shamanime.com                  twitter:  ...
NoSQL e MongoDB
NoSQL e MongoDB
NoSQL e MongoDB
NoSQL e MongoDB
Próximos SlideShares
Carregando em…5
×

NoSQL e MongoDB

2.887 visualizações

Publicada em

Palestra ministrada na Fundação Educacional de Fernandópolis em 22/02/2011 sobre banco de dados não relacionais, NoSQL e MongoDB.

Publicada em: Tecnologia
2 comentários
10 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
2.887
No SlideShare
0
A partir de incorporações
0
Número de incorporações
18
Ações
Compartilhamentos
0
Downloads
160
Comentários
2
Gostaram
10
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Ultimo: Lista todos clientes em formato JSON.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • NoSQL e MongoDB

    1. 1. Você tem dadoem casa?
    2. 2. SQL
    3. 3. SQL Structured Query LanguageSELECT * FROM * WHERE 1 = 1;
    4. 4. SQLApache Derby PostgreSQLCaché InterBaseDB2 Microsoft AccessFirebird Microsoft SQL ServerHSQLDB MySQLSQLite Oracle
    5. 5. NoSQLJefferson Q. Venerando
    6. 6. NoSQL?
    7. 7. NoSQL•Usado em 1998 como o nome de um BDrelacional open source sem interface SQL;•“Completamente distinto do modelorelacional”;•Deveria ser chamado NoREL;•Voltou a ser usado em 2009 em um eventosobre banco de dados open sourcedistribuídos.
    8. 8. NoSQL•Vieram para suprir necessidades dos BDtradicionais;•Alta performance, escalabilidade, replicação,suporte à dados estruturados e sub colunas.
    9. 9. Escalability?•Escalabilidade vertical (scale up) •Aumentar poder do servidor.•Escalabilidade horizontal (scale out) •Aumentar quantidade de servidores.
    10. 10. NoSQL•Informações necessárias agrupadas nomesmo registro;•Sem relacionamentos =)
    11. 11. NoSQL•Existem vários tipos;•São divididos pela forma usada para trabalharcom seus dados: •Wide column store •Key/value store •Graph store •Column oriented store •Document store
    12. 12. NoSQL Wide column store•Fortemente inspirados pelo BigTable dogoogle, suportam várias linhas e colunas alémde subcolunas.•Outros exemplos: •HBase(Apache) •HiperTable •Cassandra(Apache)
    13. 13. 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
    14. 14. NoSQL Graph store•Mais complexo.•Guarda objeto e não registros.•Buscas são feitas pela navegação destesobjetos.•Exemplos: •Neo4J •InfoGrid •BigData
    15. 15. NoSQL Column oriented store•São relacionais.•Tem características do NoSQL.•Dados armazenados em colunas, não emlinhas.•Exemplos: •Vertica •MonetDB •LucidDB
    16. 16. NoSQL Document oriented store•Baseados em documentos XML ou JSON.•Localização por ID único ou qualquer registrodo documento.•Exemplos: •CouchDB(Apache) •MongoDB •Riak
    17. 17. Wood in the cat
    18. 18. Manga?
    19. 19. MongoDB Orientado a Documentos•Modelo relacional: representa mundo real (queé n-dimensional) usando abordagembidimensional.•Podemos melhorar isso com análise, masposteriormente um outro atributo pode serencontrado.
    20. 20. MongoDB•O equivalente a registros são documentos.•Sintaxe JSON.
    21. 21. JASON?
    22. 22. JSON - JavaScript Object NotationJefferson = { nome:"Jefferson Queiroz Venerando", apelido:"Shaman", cidade:"Iturama"}
    23. 23. Jefferson = { nome:"Jefferson Queiroz Venerando", apelido:"Shaman", cidade:"Iturama"}db.testedb.save(Jefferson)
    24. 24. Boer = { nome:"Marcelo Tadeu Boer", disciplinas: { { nome:"APS", semestre:{4, 5, 6} }, { nome:"LTP", semestre:5 } }, faculdade:"FEF"}db.testedb.save(Boer)
    25. 25. Eae?•Representamos objetos do mundo real daforma como eles são: complexos e únicos. =)•Se precisar de novos atributos, eles serãocriados apenas onde for necessário. =)•Desenvolvedor precisa tomar cuidado probanco não virar a casa da mãe Joana. =(
    26. 26. Redundância de dados over 9000•Modelo relacional: Reduzir o máximo possívela redundância de dados(formas normais,relacionamentos).•MongoDB: Sem relacionamentos, duplicaçãonão é um problema.
    27. 27. 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"}}}
    28. 28. Redundância de dados over 9000•Não há tabelas: há coleções de documentos.•O documento é meu e eu guardo o que euquiser nele.•Documentos devem ser auto-contidos.•Uma única consulta retorna o documentointeiro.
    29. 29. Então?•Mais performance. Uma consulta retorna tudoo que precisa a respeito do documento. =)•Alterar todos registros relacionados a umaunidade semântica requer tratamento um a um.
    30. 30. Na prática...
    31. 31. Database == Database
    32. 32. > show dbs admin bsp_development local> use bsp_development switched to db bsp_development> show collections clientes fornecedores funcionarios servicos system.indexes
    33. 33. Coleção == Tabela
    34. 34. > db.clientesbsp_development.clientes> db.clientes.count()5> db.clientes.find().forEach(function(doc) { print(tojson(doc));});
    35. 35. Documento == Linha
    36. 36. { "_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)",}
    37. 37. Funcionalidades similares Consultas dinâmicas
    38. 38. > use testeswitched 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})
    39. 39. > var cursor = db.cores.find()> cursor.next(){ "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true}
    40. 40. > 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 }
    41. 41. SELECT * FROM cores WHERE nome = verde;> db.cores.find({nome:verde}){ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
    42. 42. 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" }
    43. 43. > 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 }
    44. 44. > db.pessoas.insert({nome:"Boer", idade:28})> db.pessoas.insert({nome:"Tiago", idade:24})> db.pessoas.insert({nome:"Guilherme", idade:39})
    45. 45. 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 }
    46. 46. SELECT * FROM pessoas WHERE idade <= 24> db.pessoas.find({idade: {$lte: 24}}){ "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
    47. 47. $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
    48. 48. $gt $all$gte $size$lt $exists$lte $type$ne $elemMatch$in $not$nin $where$mod
    49. 49. Funcionalidades similares Agregação
    50. 50. > db.cores.count()6> db.cores.count({primaria:true})3
    51. 51. > db.cores.distinct(nome)[ "amarelo", "azul", "laranja", "rosa", "verde", "vermelho" ]> db.pessoas.distinct(nome, {idade:24})[ "Tiago" ]
    52. 52. > 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}]
    53. 53. > 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]})
    54. 54. GROUP BY = MapReduce> var map = function() { this.tags.forEach(function(t) { emit(t, {count: 1}); }); }
    55. 55. 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}; }
    56. 56. 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 }}
    57. 57. 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 } }
    58. 58. Funcionalidades similares Relacionamentos
    59. 59. Relacionamentos Um para Muitos
    60. 60. 1. Normalizado
    61. 61. // inserir post> db.posts.insert({titulo:Analise e Projeto de Sistemas});> var post = db.posts.findOne({titulo:Analise e Projeto deSistemas});// inserir comentario> db.comentarios.insert({ nome:Jefferson, corpo:Awo Boer, eu nao tenho mais APS!, post_id : post._id});> var comentario = db.comentarios.findOne({nome:Jefferson});
    62. 62. SELECT * FROM comentarios WHERE post_id = {#post.id}> db.comentarios.find({post_id: post._id}){ "_id" : ObjectId("4d5955f1e0ab4d700255d83e"), "nome" : "Jefferson", "corpo" : "Awo Boer, eu nao tenho mais APS!", "post_id" : ObjectId("4d5955a5e0ab4d700255d83d")}
    63. 63. SELECT * FROM posts WHERE id = {#comentario.id}> db.posts.find({_id: comentario.post_id}){ "_id" : ObjectId("4d5955a5e0ab4d700255d83d"), "titulo" : "Analise e Projeto de Sistemas"}
    64. 64. 2. Embedded
    65. 65. // 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!} ]})
    66. 66. > 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!"} ]}
    67. 67. > db.posts.find({comentarios.nome:Diego})> db.posts.find({ comentarios: { $elemMatch: {nome:Diego} }})
    68. 68. // inserir posts, comentários e respostas> db.posts.insert({ titulo:APS, comentarios: [ { nome:Jefferson, corpo:Awo Boer, nao tenho mais APS!, comentarios: [ {nome:Diego, corpo:Vou ficar de exame :(}, {nome:Boer, corpo:Seus safadões!} ] } ]})
    69. 69. > db.posts.insert({ titulo: MongoDB, tags : [mongodb, databases]})> db.posts.ensureIndex({tags:1})
    70. 70. RelacionamentosMuitos para Muitos
    71. 71. > db.sites.insert({dominio: shamanime.com})> db.sites.insert({dominio: fef.br})> db.sites.find(){ "_id" : ObjectId("4d595b58e0ab4d700255d841"), "dominio" : "shamanime.com"}{ "_id" : ObjectId("4d595b62e0ab4d700255d842"), "dominio" : "fef.br"}
    72. 72. > db.usuarios.insert({ nome: Jefferson, autorizacoes: [ ObjectId(4d595b58e0ab4d700255d841), ObjectId(4d595b62e0ab4d700255d842) ]})> db.usuarios.insert({ nome: Frederico, autorizacoes: [ ObjectId(4d595b62e0ab4d700255d842) ]})
    73. 73. > var fef = db.sites.findOne({dominio:fef.br})> db.usuarios.find({autorizacoes:fef._id})// Jefferson e Frederico> var shamanime = db.sites.findOne({dominio:shamanime.com})> db.usuarios.find({autorizacoes:shamanime._id})// Jefferson
    74. 74. > var jefferson = db.usuarios.findOne({nome:Jefferson})> db.sites.find({_id:{$in: jefferson.autorizacoes}})// shamanime.com e fef.br
    75. 75. Check list:•SQL•NoSQL•Escalabilidade•MongoDB: Insert, consultas,agregação, relacionamentos•MongoDB: Update, delete, etc
    76. 76. Teste você mesmo:http://try.mongodb.org/
    77. 77. { nome: Jefferson Venerando, site: shamanime.com twitter: @shamanime forum: bsrf.shamanime.com }7º semestreSistemas de Informação - Fundação Educacional de Fernandópolis

    ×