NoSQL: Bancos de dados orientados à Document

Model: Document Store (MongoDB)

História

Open Source, free, multiplataforma, escrito em C++

Introdução

O modelo orientado a documentos é o mais usado dentre todos os modelos de bancos NoSQL.
MongoDB é o banco mais usado dentro de todos os modelos, e dentro do modelo orientado a Documentos.
MongoDB aceita comandos em JavaScript.

Scheme-free: Conforme vai criando os documentos, vai aplicando aos documentos a sua auto-descrição.
BSON é a forma de armazenamento dos dados.
Recebe os valores no formato JSON e os armazena em um formato binário chamado BSON.

Usabilidade

Alta performance.
Permitem redundâncias e incosistências.
Scheme Free, podendo usar JSON, XML, etc.

Schema Design

Atomicidade (Transação executada por completo ou não (rollback) ) somente a nível de documento.
MongoDB schema design image
Scheme design: Embedding vs Reference

Boas Práticas

Recomendação de acordo com os relacionamentos
One-to-one
Prefira atributos key-value no documento. Sem subdocumentos, listas ou referências.

                                {
                                    "_id": ObjectId("5c8f8f8f8f8f8f8f8f8f8f8"),
                                    "name": "Dio",
                                    "street": "Rua das Flores",
                                    "number": "123"
                                }
                            
One-to-few
Prefira embedding, visando que o relacionamento do documento não seja tão grande.

                                {
                                    "_id": ObjectId("5c8f8f8f8f8f8f8f8f8f8f8"),
                                    "name": "Dio",
                                    "addresses": [
                                        {"street": "Rua das Flores", "number": "123"}, 
                                        {"street": "Av das Perolas", "number": "100"}
                                    ]
                                }
                            
Enquanto houver um número limitado de subdocumentos dentro desse array é preferível que utilize subdocumentos.
Agora, supondo que tenhamos muitos relacionamentos, como em uma rede social, muitas informações como subdocumento não seria viável, pelo limite de tamanho do documento e pela dificuldade de recuperação dos dados.
Quanto maior o tamanho do documento, maior será o override da consulta.

One-to-many e Many-to-many
Prefira references.

                                {
                                    "_id": ObjectId("5c8f8f8f8f8f8f8f8f8f8f8"),
                                    "name": "Dio",
                                    "addresses": [ ObjectId('123'), ObjectId('456') ]
                                }
                                // addresses
                                {
                                    "_id": ObjectId("123"),
                                    "street": "Rua das Flores",
                                    "number": "123"
                                }
                                {
                                    "_id": ObjectId("456"),
                                    "street": "Av das Perolas",
                                    "number": "100"
                                }  
                            
Patterns de acordo com casos de uso para escolha de Schemes design
MongoDB schema design image (Patterns according to use cases)
Scheme design: Patterns according to use cases

Conceitos na prática

MongoDB - Client
Robo 3T é um cliente para MongoDB.
Compass é um cliente para MongoDB. Permite conectar-se ao MongoDB - Cloud

MongoDB - Cloud
MongoDB cloud é uma ferramenta paga, mas existe opção gratuíta para teste.

Comando nativo para conectar-se ao MongoDB
Este comando apresenta uma string de conexão (conectar com os clients) e o mongo shell (enviar comandos diretamente).
-p refere-se a password.
-u refere-se a username.

                                mongo --host 127.0.0.1:27017 -p dio -u dio
                            
Dentro de uma instância podem existir várias databases

                                // LISTA databases
                                    show databases
                                    show db_name

                                // SELECIONA se existir
                                // CRIA se não existir
                                    use db_name
                            
Operações de manipulação de dados
Recomendação: Quando o filtro for aplicado para o mesmo atributo é preferivel usar o operador in.
Performance e indices
Agregações
Agregação é o procedimento de processar dados em uma ou mais etapas, onde o resultado de cada etapa é usado na etapa seguinte, de modo a retornar um resultado combinado.

Exemplo: Importação de um banco de dados de teste no MongoDB Cloud.
Opção "Clusters", clicar nos tres pontinhos (...) e selecionar "Load Sample Dataset".

References