MongoDB operações CRUD com C#

Com o crescimento na utilização de Bancos de Dados Orientados à Documentos como por exemplo MongoDB sendo um dos mais famosos e utilizados no mercado, a arquitetura .NET e agora .NET CORE possui um driver correspondente que é responsável por conexão, operações CRUD e pesquisas avançadas.

Esse driver que está disponível pelo NUGET com o nome de MongoDB.Driver foi criado por rstam’s e craiggwilson’s, é de fácil instalação e utilização, e traz todos os recursos necessários para incluir, alterar, remover, atualizar e trazer informações (com filtros, ordernações, etc.) de documentos contidos em uma determinada coleção.

Para desenvolver uma coleção e que tenha disponibilidade em seu sistema, codifique uma simples classe que deve corresponder aos tipos existente no banco de dados do MongoDB e que farão a ponte entre o modelo lógico e físico de forma transparente, que são chamados de documentos, ou seja, uma coleção possui documentos que são representados por classes no mundo .NET (isso não é obrigatório pode ser utilizado BsonDocument , mas, torna a codificação maior e custosa, pode assim ocasionar problemas de manutenção futuros).

O tipos de dados contidos atualmente no MongoDB são:

  • String : Este é mais comumente usado tipo de dados para armazenar os dados. Cordas em MongoDB deve ser UTF-8 válida.
  • Integer : Este tipo é usado para armazenar um valor numérico. Integer pode ser de 32 bits ou 64 bits, dependendo do seu servidor.
  • Boolean : Este tipo é usado para armazenar um booleano (true/ false) valor.
  • Double : Este tipo é usado para armazenar valores de ponto flutuante.
  • Min/ Max keys : Este tipo é usado para comparar um valor contra os elementos mais baixos e mais altos BSON.
  • Arrays : Este tipo é usado para armazenar matrizes ou lista ou valores múltiplos em uma chave.
  • Timestamp : ctimestamp. Isto pode ser útil para a gravação quando um documento foi modificado ou adicionado.
  • Object : Este tipo de dados é usado para documentos incorporados.
  • Null : Este tipo é usado para armazenar um valor nulo.
  • Symbol : Este tipo de dados é utilizada de forma idêntica a uma corda no entanto, é geralmente reservada para idiomas que usam um tipo de símbolo específico.
  • Date : Este tipo de dados é usado para armazenar a data ou a hora atual no formato de UNIX.Você pode especificar o seu próprio tempo de data através da criação de objeto de data e passar o dia, mês, ano para ele.
  • Object ID : Este tipo de dados é usado para armazenar o ID do documento.
  • Binary data : Este tipo de dados é usado para armazenar dados binay.
  • Code : Este tipo de dados é usado para armazenar o código javascript em documento.
  • Regular expression : Este tipo de dados é usado para armazenar expressão regular

Referencias e direitos autorais: MongoDB Datatypes

Cada um desses tipos podem ser representados nos tipos de dados do C#/VB.Net e trabalhar com todas as informações disponíveis sem nenhum trabalho adicional, esforço e/ou conversão de dados. O grande intuito é demostrar a utilização desse driver com a tecnologia .NET suas configurações de conexão e passar um CRUDna criação de documentos para uma determinada coleção.

1.Instalação do Driver:

PM> Install-Package MongoDB.Driver
  • 1.2 Inteface Visual do Nuget no Visual Studio

2.Configurações de conexão:

Em new MongoClient é configurado astring que é a configuração principal de conexão que no caso exemplo foi feito localmente e não tem senha, mas, no link da documentação do MongoDB Connection String URI Format tem todas os tipos possíveis para configurar o seu banco, conectar com usuário e senha e outras opções de configuração.

Na linha client.GetDatabase o paramento (example) informado é o nome do banco de dados, que se não existir na primeira inclusão de qualquer documento cria o banco, sua coleção e consequentemente o documento. Isso torna também o trabalho menor, porque, a preocupação é no desenvolvimento a partir da conexão e o driver faz o seu papel de criar bancos inexistentes e coleções novas mediante a inserção de documentos, claro se tudo existir, só terá mesmo a manipulação do documento.

3.Entidade ou classe que representa o documento.

A partir de agora com a conexão estabelecida precisa criar o modelo que represente o documento de uma coleção, um exemplo a seguir mostra uma entidade de noticias que vai representar o documento da coleção News:

Observe que a mesma foi decorada ou configurada com BsonRequired, BsonId, BsonElement, etc. que são configurações para controlar a serialização e a deserialização de Bsone essas configurações estão descrita nos links:

e são de grande valia dando um controle maior na elaboração e configuração de cada item da sua coleção.

4.Criando a coleção news na base example.

As duas primeiras linhas já foram explicadas no tópico 1, na 3º linha seria a manipulação da coleção News onde IMongoCollection<News> vai receber à database.GetCollection<News>("news") onde esse método tem um parâmetro para ser informado, o nome da coleção que automaticamente nesse caso é o mesmo nome da coleção só que tudo em minúsculos.

Um ponto interessante a explanar é na decoração das configurações: existe o decorador BsonElement onde foram configurados os nomes dos campos tudo em minusculo para manter um padrão.

5.Operações CRUD

Novos documentos

Para criar um novo documento, é só instanciar a classe News passar os valores e na variável de coleção colNews chamar o método InsertOne passando a instância da News, exemplo:

e no banco ficaria uma representação da seguinte forma, utilizando Robomongo que é um gerenciador para o MongoDB:

e ainda se quiser visualizar no formato json clique em cima o registro com o botão direito acesse o menuView Document para visualizar esse resultado:

Além do InsertOne, para criar documentos tem os métodos InsertMany (que é responsável em inserir varias documentos) e seus respectivos métodos assíncrono (InsertOneAsync e InsertManyAsync).

Editando documento

Para alterar um documento da coleção foi criado um filtro com uma expressão Linq que é um recurso adicionado já algum tempo e que torna o trabalho muito fácil. O filtro criado é para a busca na chave _id e se o documento for encontrada alterar o campo Value para 200, logo após a atribuição do valor e com o método ReplaceOne faça a alteração no campo alterado. Esse método ReplaceOne retorna uma instância da classe ReplaceOneResult que é o resultado do que aconteceu no ReplaceOne onde duas propriedades são importantes:

  • result.MatchedCount que representa quantos campos possui para alteração
  • result.ModifiedCount que representa quantos campos foram alterados

isso traz uma estimativa do que foi mudado e quais campos poderiam ser alterados. Também possui o método assíncrono ReplaceOneAsync como o mesmo objetivo de alterar coleções.

Buscando documentos

Como já relatado a busca pode ser feita utilizado expressões com Linq, que nos oferece uma gama grande de pesquisa, exemplos:

  • Busca pela identificação da documento
  • Busca pelo titulo da documento
  • Busca pelo titulo e data do documento

ou seja, pode utilizar qualquer tipo de pesquisa e trazer lista dos documentos de uma determinada coleção. Utilizando o método de extensão contido na variável colNews, o AsQueryable você abre um leque maior ainda de opções como por exemplo:

  • Busca pelo titulo e ordenação pela data com Linq

a variável queryAbleNews nos proporciona a ver o que o driver junto com linq faz por baixo dos panos, olha a imagem:

ou seja, são os comandos do MongoDB para filtros e ordenação dos documentos de uma coleção, na linha seguinte os comandos são executados e o resultado dos documentos são retornados em uma lista.

Removendo um ou vários documentos

Para remover documentos de uma coleção, faça o filtro corresponde e utilize o método DeleteOne para remover um documento ou DeleteMany para remover vários documentos, exemplo:

esses métodos retornam uma instância da classe DeleteResultque informa pela propriedade DeleteCount a quantidade de documentos que foram excluídos. Respectivamente possui também os métodos assíncrono DeleteOneAsync e DeleteManyAsync.

6.Repository .NET Core MongoDB

Foi criado um camada com o padrão de desenvolvimento Repository Patterns que pode ser baixada via NUGET e tem o tutorial explicando como configurar e utilizar em aplicações:

Essa camada tem por objetivo melhorar a codificação, padronizar os métodos, para estudos e observar a evolução continua do driver para MongoDB.

Referencias:

Show your support

Clapping shows how much you appreciated Fulvio C Canducci Dias’s story.