Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Batista Neto

Instalei o MongoDB, e agora ?

Recommended Posts

No caso de trabalhar com datas or exemplo, como ele vai saber que é uma data, se não existe schema pré-definido?

 

A responsabilidade de saber se uma informação é uma data é da aplicação, pense que a aplicação é o schema de alto nível.

 

Dessa forma,

 

> use meudb;
> db.resources.save( { name : 'some resource' , since : new Date() } ); 
> db.resources.save( { name : 'other resource' , since : new Date() } ); 	
> db.resources.find(); 	
{ "_id" : ObjectId("4c7529027f8b9ac516000000"), "name" : "some resource", "since" : "Wed Aug 25 2010 11:30:26 GMT-0300 (BRT)" } 	
{ "_id" : ObjectId("4c752962873bc4c79b4785b0"), "name" : "other resource", "since" : "Wed Aug 25 2010 11:32:02 GMT-0300 (BRT)" }

Ou, usando o PHP:

 

<?php
$mongo = new Mongo( 'mongodb://meuUsuario:minhaSenha@meuHost:27017' );
$mongo->selectDB( 'meudb' )->selectCollection( 'resources' )->save( array( 'name' => 'some resource' , 'since' => new MongoDate() ) );

 

Dessa forma, você que terá a responsabilidade de saber o que está gravando e recuperando do banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo.

 

Normalmente sempre ouvimos que muitas coisas é interessante deixar por conta do banco de dados por ele conseguir processar com mais agilidade grande quantidade de dados.

 

Ou seja sempre que que é necessário formatar uma data, deixar o banco de dados fazer isso e deixar a aplicação livre disso.

 

Com banco de dados NoSQL é diferente? Ou seja praticamente tudo fica por conta da aplicação? Isso não deixaria a aplicação lenta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo.

 

Normalmente sempre ouvimos que muitas coisas é interessante deixar por conta do banco de dados por ele conseguir processar com mais agilidade grande quantidade de dados.

 

Ou seja sempre que que é necessário formatar uma data, deixar o banco de dados fazer isso e deixar a aplicação livre disso.

 

Com banco de dados NoSQL é diferente? Ou seja praticamente tudo fica por conta da aplicação? Isso não deixaria a aplicação lenta?

 

Isso passa a ser uma questão de delegação.

 

Sempre que você se deparar com uma situação de tratamento de dados, pergunte para a aplicação:

 

"De quem é a responsabilidade de fazer isso ?"

 

Se sua aplicação responder para você que a responsabilidade é do banco de dados, basta fazer:

 

> Date.prototype.sayHello = function(){
<econds() ].join( ':' ) , 'do dia' , [ this.getDate() , this.getMonth() + 1 , this.getFullYear() ].join( '/' ) ].join( ' ' ); 	
... }
function () {
	return ["Olá, agora são", [this.getHours(), this.getMinutes(), this.getSeconds()].join(":"), "do dia", [this.getDate(), this.getMonth() + 1, this.getFullYear()].join("/")].join(" ");
}
>
> resource = db.resources.findOne( { since : { $gte : new Date( 2010 , 7 , 24 ) } } );
{
 	"_id" : ObjectId("4c7529027f8b9ac516000000"),
 	"name" : "some resource",
 	"since" : "Wed Aug 25 2010 11:30:26 GMT-0300 (BRT)"
}
> resource.since
"Wed Aug 25 2010 11:30:26 GMT-0300 (BRT)"
> resource.since.sayHello();
Olá, agora são 11:30:26 do dia 25/8/2010

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

João, acho que entendi o conceito, mas ainda ficou confuso para mim.

 

Você citou um grupo de usuários, nesse caso é comum existirem poucos registros.

 

Mas vamos pensar em categoria/produto. Eu teria que listar as 300 categorias manualmente na aplicação? Caso seja isso, não seria pior assim?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas vamos pensar em categoria/produto. Eu teria que listar as 300 categorias manualmente na aplicação? Caso seja isso, não seria pior assim?

 

Certo hargon, como eu disse, é uma questão de modelagem.

 

Nesse caso que você citou ou mesmo no caso do grupo de usuários, como é aqui no fórum, que podemos criar e remover grupos dependendo da situação.

 

Sempre que for necessário existir uma coleção para uma informação não estática, você pode criar referências:

 

Apenas mantendo a situação de Usuarios/Grupos para ficarmos no contexto do tópico:

 

> db.groups.save( { gid : 1 , name : 'Administrator' } );
> db.groups.save( { gid : 2 , name : 'Analyst' } ); 	
> db.groups.save( { gid : 4 , name : 'Client' } );

Como pode ver, criamos 3 grupos de usuários, agora, vamos pegar o grupo Administrador:

 

> administrator = db.groups.findOne( { gid : 1 } );
{
 	"_id" : ObjectId("4c754d81061f2304f8a60c0a"),
 	"gid" : 1,
 	"name" : "Administrator"
}

Com a variável administrador criada, vamos criar um usuário:

 

> db.users.save( {
... uid : 1,
... name : 'João Batista Neto',
... group : new DBRef( 'groups' , administrator._id ),
... password : 'minhasenha'
... } );

Como pode ver, utilizei um DBRef para criar a referência, agora vamos ver como ficou nosso usuário:

 

> neto = db.users.findOne( { uid : 1 } );
{
 	"_id" : ObjectId("4c754fc2061f2304f8a60c10"),
 	"uid" : 1,
 	"name" : "João Batista Neto",
 	"group" : {
 	"$ref" : "groups",
 	"$id" : ObjectId("4c754d81061f2304f8a60c0a")
 	},
 	"password" : "minhasenha"
}

Perceba que a propriedade group possui agora duas propriedades, $ref que indica a coleção de onde estamos usando a referência e $id que é a nossa "chave primária".

 

Se quisermos ver qual o nome do grupo que o usuário neto está, basta dar um fetch() na propriedade group:

 

> neto.group;
{ "$ref" : "groups", "$id" : ObjectId("4c754d81061f2304f8a60c0a") }
> neto.group.fetch();
{
 	"_id" : ObjectId("4c754d81061f2304f8a60c0a"),
 	"gid" : 1,
 	"name" : "Administrator"
}
> neto.group.fetch().name;
Administrator

"E se eu precisar mudar o nome do grupo de Administrator para Gestor ?"

 

Simples:

 

> administrator = db.groups.findOne( { gid : 1 } );
{
 	"_id" : ObjectId("4c754d81061f2304f8a60c0a"),
 	"gid" : 1,
 	"name" : "Administrator"
}
> administrator.name = 'Gestor';
Gestor
> db.groups.update( { gid : 1 } , administrator );
> db.groups.find();
{ "_id" : ObjectId("4c754d81061f2304f8a60c0a"), "gid" : 1, "name" : "Gestor" }
{ "_id" : ObjectId("4c754d8c061f2304f8a60c0b"), "gid" : 2, "name" : "Analyst" }
{ "_id" : ObjectId("4c754daf061f2304f8a60c0c"), "gid" : 4, "name" : "Client" }

Agora, o resultado:

 

> neto = db.users.findOne( { uid : 1 } ).group.fetch();	
{ "_id" : ObjectId("4c754d81061f2304f8a60c0a"), "gid" : 1, "name" : "Gestor" }
> neto = db.users.findOne( { uid : 1 } ).group.fetch().name;
Gestor

Como pode ver, quando atualizamos alguma propriedade da referência, todos que a utilizam passam a ter o novo valor.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato é muito interessante o assunto e este novo fórum parece que veio com toda a força com varias pessoas muito qualificadas a sua frente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eita...

 

Eu que já vivia serializando o conteúdo todo e colocando array tudo num lugar só agora acho que o negócio fica mais fácil...

Só preciso ver como vo montar um teste desses ai pra brinca de banco de dados rs :)

 

Mas quanto ao conteúdo la de cima:

<?php
$usuarios = array(
 array(
 '_id' => 1,
 'nome' => 'João Batista Neto',
 'emails' => array( 'email1@exemplo.com' , 'emails2@exemplo.com' )
 )
);

Eu já fazia isso antes xD colocando os valores de email ou informações adicionais serializadas... no mysql normal

Só era um pouquinho mais chato de printa depois...

 

Mas como já tenho mania de fazer isso acho que talvez um NoSql deva ser mais adequado pra mim...

 

Vo ver se aprendo isso ae.

 

PS: gostei do tópico mto bem explicado :)

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usa esse code

 

function getTime(){ static $tempo; if( $tempo == NULL ){ $tempo = microtime(true); } else{ echo 'Tempo (segundos): '.(microtime(true)-$tempo).''; } } 

//codigo de inserir ou oq  for testar


getTime();

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Mas vamos pensar em categoria/produto. Eu teria que listar as 300 categorias manualmente na aplicação? Caso seja isso, não seria pior assim?

 

Certo hargon, como eu disse, é uma questão de modelagem.

 

Nesse caso que você citou ou mesmo no caso do grupo de usuários, como é aqui no fórum, que podemos criar e remover grupos dependendo da situação.

 

Sempre que for necessário existir uma coleção para uma informação não estática, você pode criar referências:

 

Apenas mantendo a situação de Usuarios/Grupos para ficarmos no contexto do tópico:

 

> db.groups.save( { gid : 1 , name : 'Administrator' } );
> db.groups.save( { gid : 2 , name : 'Analyst' } ); 	
> db.groups.save( { gid : 4 , name : 'Client' } );

Como pode ver, criamos 3 grupos de usuários, agora, vamos pegar o grupo Administrador:

 

> administrator = db.groups.findOne( { gid : 1 } );
{
 	"_id" : ObjectId("4c754d81061f2304f8a60c0a"),
 	"gid" : 1,
 	"name" : "Administrator"
}

Com a variável administrador criada, vamos criar um usuário:

 

> db.users.save( {
... uid : 1,
... name : 'João Batista Neto',
... group : new DBRef( 'groups' , administrator._id ),
... password : 'minhasenha'
... } );

Como pode ver, utilizei um DBRef para criar a referência, agora vamos ver como ficou nosso usuário:

 

> neto = db.users.findOne( { uid : 1 } );
{
 	"_id" : ObjectId("4c754fc2061f2304f8a60c10"),
 	"uid" : 1,
 	"name" : "João Batista Neto",
 	"group" : {
 	"$ref" : "groups",
 	"$id" : ObjectId("4c754d81061f2304f8a60c0a")
 	},
 	"password" : "minhasenha"
}

Perceba que a propriedade group possui agora duas propriedades, $ref que indica a coleção de onde estamos usando a referência e $id que é a nossa "chave primária".

 

Se quisermos ver qual o nome do grupo que o usuário neto está, basta dar um fetch() na propriedade group:

 

> neto.group;
{ "$ref" : "groups", "$id" : ObjectId("4c754d81061f2304f8a60c0a") }
> neto.group.fetch();
{
 	"_id" : ObjectId("4c754d81061f2304f8a60c0a"),
 	"gid" : 1,
 	"name" : "Administrator"
}
> neto.group.fetch().name;
Administrator

"E se eu precisar mudar o nome do grupo de Administrator para Gestor ?"

 

Simples:

 

> administrator = db.groups.findOne( { gid : 1 } );
{
 	"_id" : ObjectId("4c754d81061f2304f8a60c0a"),
 	"gid" : 1,
 	"name" : "Administrator"
}
> administrator.name = 'Gestor';
Gestor
> db.groups.update( { gid : 1 } , administrator );
> db.groups.find();
{ "_id" : ObjectId("4c754d81061f2304f8a60c0a"), "gid" : 1, "name" : "Gestor" }
{ "_id" : ObjectId("4c754d8c061f2304f8a60c0b"), "gid" : 2, "name" : "Analyst" }
{ "_id" : ObjectId("4c754daf061f2304f8a60c0c"), "gid" : 4, "name" : "Client" }

Agora, o resultado:

 

> neto = db.users.findOne( { uid : 1 } ).group.fetch();	
{ "_id" : ObjectId("4c754d81061f2304f8a60c0a"), "gid" : 1, "name" : "Gestor" }
> neto = db.users.findOne( { uid : 1 } ).group.fetch().name;
Gestor

Como pode ver, quando atualizamos alguma propriedade da referência, todos que a utilizam passam a ter o novo valor.

 

;)

 

O objeto é apenas a referência ou ele vem junto com a consulta?

 

Para o caso da primeira alternativa, isso não gera a necessidade de múltiplas consultas onde caberia apenas uma?

para o caso da segunda alternativa, isso não gera um custo desnecessário de dados/memória/processamento em trazer o objeto inteiro quando eu preciso de apenas, por exemplo, o nome dele?

 

É aquela velha questão SIMPLEXML vs XML_PARSER do PHP. Processar o arquivo completo e sacrificar o processamento em prol de performance nas consultas ou ser econômico em geral e aguardar um pouco a mais pra cada consulta?

 

Em bancos de dados relacionais a resposta é a segunda alternativa com ressalvas. Basta adicionar um EXPLAIN antes de qualquer consulta que leve um JOIN para ver que o banco efetuou mais de uma consulta. Porém, o que seria o Object() retornado pelo Mongo, teria apenas as informações que eu pedi durante a minha consulta, ou seja, apenas os dados que eu vou utilizar. Não vem a linha por completa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou começando a ler sobre o MongoDB agora e tenho uma dúvida.

 

Situação: armazenar os itens que o usuário gosta.

 

Como eu imaginei que ficaria:

 

usuarios
{
  "_id" : ObjectId("1"),
  "nome" : "Pedro",
  "itens" : [{ "$ref" : "itens", "$id" : ObjectId("1") } , { "$ref" : "itens", "$id" : ObjectId("2") }]
}
{
  "_id" : ObjectId("2"),
  "nome" : "João",
  "itens" : [{ "$ref" : "itens", "$id" : ObjectId("1") }]
}

itens
{
  "_id" : ObjectId("1"),
  "nome" : "Item 1"
}
{
  "_id" : ObjectId("2"),
  "nome" : "Item 2"
}

 

Considerando essa situação (não sei se escrevi certo mais acredito ter dado para entender), segue as dúvidas:

 

- Como montar uma lista com o nome do usuário e a quantidade de itens que ele gosta, em ordem decrescente do total de itens;

- Caso seja necessário inserir comentários nos itens, qual a melhor maneira de tratar isso: inserir os comentários dentro do documento do usuario, do item ou criar um documento para os comentários com os ids para referencia;

- Com a solução adotada para o item anterior como mostrar a quantidade de comentários feitos por cada usuário e a quantidade de comentários de cada produto.

 

Espero não estar abusando mais acredito que com essas informações conseguirei ter uma idéia mais clara do funcionamento do MongoDB.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, estou com um Mer de um banco relacional e vou fazer o modelo do mesmo banco no MongoDB, já sanei diversas dúvidas referente a relacionamentos, documentos auto-contidos entre outras, um dos últimos posts mostrou que é possível utilizar o DBREF para relacionar tabelas, aqui está a encrenca, com a existência desse mecanismo posso modelar meu banco de forma bem parecida com o que está hoje, é correto eu usar esse modelo? Se o objetivo do MongoDb é perfomance, se eu modelar o banco dessa maneira ele perderá esse objetivo? Estarei utilizando um conceito errôneo? Desculpe a quantidade de perguntas é que estou tentando me desvencilhar de velhos conceitos.

Compartilhar este post


Link para o post
Compartilhar em outros sites
tendo vários arrays abaixo como no exemplo



db.colecao.insert(eletronicos : ['microfone', 'data-show', 'jegue']);


{
"eletronicos": {
"0": "microfone",
"1": "data-show",
"2": "jegue"
},
"_id": "vvJjcF3tZJRaqxxum"
}



Como seleciono os que tem "jegue"?

Considerando que a lista pode ser mais comprida ou mais curta e "jegue" não precisa estar na posição "2"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.