A versão 3.0 do driver C# está aqui! O que você precisa saber?
Avalie esse Artigo
Temos boas notícias! Pela primeira vez em oito anos, o driverC# do MongoDB teve uma atualização de versão principal. Então, para festejar o lançamento de 3.0, vamos dar uma olhada em algumas das coisas que você precisa saber e alguns exemplos de recursos e alterações interessantes.
Você pode visualizar o guia de atualização em nossa documentação para ver como mudar de 2.X para 3.0. Também temos uma seção na documentação sobre as novidades do 3.0.
A equipe do C# Driver destinou muito tempo e cuidado a esta versão e ela resolve muitos problemas de tecnologia e recursos técnicos. Abaixo está uma lista de algumas coisas que é bom saber sobre esta versão.
Como desenvolvedor que usa o driver, você pode nem saber disso, mas a partir de uma versão menor anterior do driver, ele foi divisão em duas camadas conhecidas como "high " e "core. " Alto é essencialmente um cliente do núcleo e o que está atualmente exposto aos usuários. No entanto, desde então ficou claro que o núcleo não precisa ser público, então eles foram incorporados em uma única assembléia. Isso tudo faz parte da divida técnica que a equipe queria resolver para 3.0.
O LINQ está na versão 3 há algum tempo, portanto, com o lançamento do 3.0, o driver agora suporta V3 como padrão e o V2 foi removido. Anteriormente, antes de V2.19, você teria que especificar explicitamente o uso de V3 por meio de um objeto
MongoClientSettings
.Agora, você não precisa usar isso e, em vez disso, obterá os benefícios de V3 sem precisar especificá-lo.
Se você tiver cenários em que está armazenando arquivos que excedem o limite de documento 16MB, talvez tenha se encontrado usando o pacote GridFS . Anteriormente, esta era uma biblioteca separada, mas agora está disponível imediatamente com 3.0!
O MongoDB suporta GUID como um tipo de dados e, em muitas coleções do MongoDB , os campos GUID em um documento usam o mesmo tipo sob o capô,
BsonBinaryData
. Na documentação , ele explica os diferentes valores de propriedade que lidam com os diferentes subtipos de GUID que podem ser encontrados em coleções mais antigas.Em resumo, o V2 pressupõe que todos os GUIDs usem o mesmo subtipo de BsonBinaryData. Este é o padrão no driver C# 2.X. Em V3, campos no mesmo documento podem usar diferentes formatos GUID e a representação é configurada no nível da propriedade usando o serializador.
A partir da versão do driver 3.0 , a V3 se tornará o padrão, e a compatibilidade com a V2 será removida.
Também há alterações no comportamento padrão do serializador GUID, que agora lidará com GUIDs por padrão como
GuidReprensentation.Unspecified
. Isso é para encorajar a ser explícito sobre o tipoGuidRepresentation que está sendo usado.Atualmente, o Conselho de práticas recomendadas para o uso de
MongoClient
é fornecer a ele um escopo de vida útil único. No entanto, foram observados alguns problemas que exigem o escopo por instância, pois o escopo da vida útil está causando uso excessivo de memória e recursos não descartados.Agora, foi introduzido um recurso experimental em que um novo MongoClient implementa
IDisposable
, o que significa que a classe e quaisquer classes que implementem a interface IMongoClient têm acesso a um métodoDispose()
. Uma vez descartadas, qualquer conexão de membro resultará em um ObjectDisposedException
No entanto, chamar Dispose não descartará o cluster e as conexões subjacentes; para isso, você ainda precisará chamar
ClusterRegistry.UnregisterAndDisposeCluster()
.Esta nova versão do 3.0 traz muitas melhorias para coisas relacionadas a data e hora. Não se preocupar, não vamos entrar em um debate sobre fusos horários!
O primeiro são as questões relacionadas à inclusão ou exclusão de data ou hora. No .NET 6 (lançado em 2021), dois novos tipos foram introduzidos chamados DateOnly e TimeOnly, que removem a necessidade de uma hora ou data, dependendo do tipo. Isso significa que não precisamos criar um horário como antes - por exemplo, quando era apenas a data que importava.
3.0 agora suporta estes tipos em suas classes de modelo!
Desde o início, o driver já serializou
DateTimeOffset
como arrays BSON. Isso agora mudou de modo que o comportamento padrão é que, sob o capô, eles sejam serializados como documentos BSON.Se quiser retornar ao comportamento anterior, você pode adicionar o atributo
[BsonRepresentation(BsonType.Array)]
à propriedade em seu modelo.Anteriormente,
decimal
e decimal128
foram serializados como valores de string BSON. Isso consistia em ter que fazer algum código extra manual para tratá-lo como um decimal em seu código. Em 3.0, isso foi alterado para que, por padrão, seja armazenado como Decimal128
valores.No entanto, há uma opção de continuar usando a string, se você preferir. Basta adicionar o atributo
[BsonRepresentation(BsonType.String)]
à sua propriedade.Também houve alterações na API BulkWrite como parte da versão 3.0. Elas têm como objetivo melhorar a experiência do desenvolvedor, mudando a forma como ela funciona e como pode ser aplicada.
Os desenvolvedores só
BulkWrite()
executar essasBulkWriteAsync()
em uma coleção de cada vez. Além disso, isso só poderia ser feito para um único tipo de gravação, como um lote de inserções, exclusões etc. Você ainda poderia fornecer uma mistura de tipos para a chamada, mas sob o capot o driver os separaria, levando a vários chamadas de banco de dados de dados que não são as mais eficientes, pois isso leva a várias chamadas de ida e volta. Isso significa que as chamadas BulkWrite demoram muito mais tempo.Isso foi alterado a partir de 3.0. Agora você pode executar várias operações de gravação, como atualização ou exclusão, com uma única chamada de banco de dados de dados por meio da API BulkWrite.
Agora você usa uma classe
BulkWriteModel
que vem na forma de:BulkWriteInsertOneModel<TDocument>
BulkWriteUpdateOneModel<TDocument>
BulkWriteUpdateManyModel<TDocument>
BulkWriteReplaceOneModel<TDocument>
BulkWriteDeleteOneModel<TDocument>
BulkWriteDeleteManyModel<TDocument>
Você também pode substituir TDocument por sua classe de modelo POCO. Não deixe de acessar a documentação do BulkWrite para ver mais informações e amostras de código relacionadas a essa alteração.
Já faz algum tempo que aceitamos a criptografia no nível do campo do lado do cliente (CSFLE), que adiciona uma camada extra de segurança ao criptografar seus dados antes de serem enviados pela rede para o MongoDB.
Isso foi feito usando a bibliotecaMongoDB.LibMongocrypt. No entanto, em 3.0, isso foi ligeiramente alterado. A funcionalidade básica do CSFLE agora pode ser encontrada no MongoDB.Driver.Encryption.
Também houve uma alteração com o pacote de autenticação Amazon Web Services , que agora tem seu próprio pacote. Isso significa que, se você não quiser a funcionalidade de autenticação do Amazon Web Services , não terá mais esse excesso de código oculto em seu aplicativo publicado.
Na verdade, essa refatoração e movimentação em pacotes diferentes levou a algumas estatísticas interessantes para quem curte dados:
- Em um aplicação CRUD simples, o tamanho da pasta publicada passou de 38MB para 4MB!
- Foram removidas cerca de 32% das APIs públicas
- A solução tem seis projetos a menos, com 16 em vez de 22
- Reduziu de 663K linhas de código para 555K- uma redução enorme de 16%!
- Removido sobre 200 .cs .idl
Também descontinuamos o pacote
MongoDB.Driver.Legacy
em 2.X. Isso estava disponível em 2.X para facilitar as pessoas que migram de 1.X. No entanto, a presença contínua da API 1.X está causando mais confusão do que desejamos. Em 3.0, isso foi completamente removido.Que legal! Após oito anos, temos uma versão principal do driver C#!
Este artigo foi apenas uma prévia de algumas mudanças e coisas que você deve saber. É claro que o melhor lugar para ver todas as novidades é em nossa documentação.
Boas 3.0!
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.