terça-feira, 22 de dezembro de 2015

MongoDB - Extras

Nesse extra, iremos aprender as seguintes funções:

find().length()
count()
distinct()
limit().skip()

find(query).length() X count(query)
Essas duas funções fazem a mesma coisa, retornam a quantidade de documentos encontrado na busca. Mas como sempre a uma diferença, o count() é mais rápido que se usar o find().length(), já que esse último traz todos os documentos para a memorias e faz uma interação dos dados, fazendo uma contagem dos documentos, o que gasta mais tempo.
db.collection.find(query).length()
db.collection.count(query)

distinct('campo')
Essa função serve para retornar os valores distintos do campo. Por exemplo, usando a nossa database Pokedex, nossa collection possui vários pokémons de vários tipos (water, fire, electric, …), muitos desses tipos se repetem. Se utilizarmos o distinct nesse campo, ele irá retornar cada tipo de existente na nossa collection, sem repeti-los. Faça o teste.
db.pokemons.distinct('types')
Se quiser saber quantos tipos distintos existem, basta fazer…
db.pokemons.distinct('types').length
Também podemos ver os tipos de pokémons em ordem alfabética (A-Z)
db.pokemons.distinct('types').sort()
E se quiser na ordem inversa (Z-A)
db.pokemons.distinct('types').sort().reverse()

Fácil, extremamente fácil…

E agora as relações…

Relacionamento
O relacionamento no Mongo é diferente de bancos de dados relacionais. No Mongo não existe o JOIN usado para juntar duas tabelas que possuam alguns campos específicos iguais, que são usados em bancos relacionais.

No Mongo existem duas formas de fazer esse relacionamento, a forma Manual e a DBRef. A manual nada mais é, do que do que salvar o _id de uma coleção em outra coleção que estamos relacionando, a segunda forma, a DBRef nada mais é do que uma convenção para representar um documento relacional, isso inclue: $ref (nome da coleção a ser referenciada), $id (o ObjectId do documento referenciado) e $db (a database onde a coleção referenciada se encontra).

Explain
O explain mostra para a gente o que o banco está fazendo, mostrando como ele executa as query internamente. Todos os comando que fazemos são passados para o interpretador e convertido para uma forma que o Mongo entenda e possa executar. Crie uma query e execute o seguinte comando:
db.pokemons.find(query).explain()
Como resultado, você verá que ele retornar uma série de informações, como por exemplo, o namespace que contem o nome da database e da collection, o parsedQuery que mostra como a query foi interpretada pelo Mongo, o serverInfo que mostra informações do servidor como o nome do host, porta e versão do Mongo.
Você pode obter mais informações, se fizer da seguinte forma:
db.pokemons.find(query).explain(“executionStats”)
Isso trará informações extras, como a quantidade de arquivos retornados com o find executado, total de arquivos examinados, o tempo que levado para fazer a pesquisa, entre outras coisas.

Index
Índice é uma forma de deixar uma busca mais rápida. Ao criamos um index em uma collection, o Mongo irá tratar esse campo de forma diferente, fazendo pesquisas por esse campo de forma mais rápida. Você pode ver o index da sua collection com o seguinte comando:
db.collection.getIndexes()
E pode criar index, com esse outro:
db.collection.createIndex({campo: 1})
E se quiser remover algum index que você já criou:
db.collection.dropIndex({campo: 1})

GridFS
É um sistema de arquivos do MongoDB que permite armazenar arquivos binários (fotos, vídeos) diretamente no banco. Arquivos de documento do tipo BSON é de 16 Mb, para armazenarmos arquivos maiores utilizamos o GrindFS.
Por exemplo, se fossemos adicionar um video de formato mp4, no sistema GridFs, bastaria executar:
mongofiles -d nome_database -h ip_do_host put video.mp4
Para fazer isso localmente, podemos colocar como ip_do_host o ip local, 127.0.0.1. Lembrando que o nome_database é a database que será criada para armazenar os arquivos binários.

Lembrando que esse comando é um binário e não pode ser feito no terminal do Mongo. Deve ser feito no terminal normal.

Replica
A replica é o espelhamento dos dados de um servidor para outro. Um conjunto de replicas é chamado de ReplicaSet, onde cada ReplicaSet pode conter 50 replicas.
A replica funciona da seguinte forma: qualquer escrita feita na replica primaria, a primaria irá replicar para as secundarias. Isso ocorre em duas etapas: Initial Sync e a Replication.

Initial Sync
Esse é a primeira etapa na replicação. Onde ele consulta cada coleção em cada banco de dados de origem e insere todos os dados em suas próprias cópias dessa seleção, é dessa forma que é feita a clonagem dos bancos de dados. Esse processo de clonagem apenas copia os dados válidos, omitindo documentos inválidos.
Depois ele aplica as alterações para o conjunto de dados, para que depois possa ser feito a transação para o estado secundário.

Replication
Depois de já ter nossas replicas construídas, a Replication vai continuar replicando e sincronizando os dados. Ele sempre fica rodando para que cada alteração no primário seja replicado, mantendo os membros das Replicas (ReplicaSet), atualizados.

Oplog
É o log de operações, qualquer alteração feito na replica primária é colocada a ação no oplog que é uma capped collection (coleções de tamanho fixo) especial. O MongoDB aplica as alterações no primário e, em seguida, registra as operações no oplog do primário. Onde os membros secundários, copiam e aplicam essas operações do oplog em um processo assíncrono.

As replicas servem para garantir que tenhamos a nossa base de dados em outros servidores, para caso aconteça algum imprevisto no nosso servidor principal. Por isso sempre tenha uma replica como garantia, pois nenhum servidor é 100%.

Como fazer replicas?

Veja no nosso próximo post ;)

0 comentários:

Postar um comentário