Modelagem e serialização de dados
Nesta página
- Visão geral
- Parâmetro de tipo genérico
- Modelo de Dados Personalizado
- Exemplo de estrutura personalizada
- Várias parametrizações
- Serialização personalizada
- Serializar uma string como um ObjectId
- Serializar um DateTime como uma string
- Serialize um u32 como um f64
- Outros atributos e módulos
- Informações adicionais
- Documentação da API
Visão geral
Neste guia, você aprenderá como o driver Rust lida com conversões entre os tipos BSON e Rust. O processo de conversão de um tipo Rust para BSON é chamado de serialização, enquanto o processo inverso é chamado de desserialização.
A linguagem Rust usa um sistema de tipos estático, mas BSON tem um esquema dinâmico. Para lidar com conversões entre tipos de Rust e BSON, o driver e a biblioteca bson
integram a funcionalidade da estrutura Serde. Para saber como instalar a serde
crate,consulte serde no crates.io
registro de crate.
Ao implementar a funcionalidade do crate de serde
em seu aplicativo, você pode usar tipos de Rust personalizados, como structs e enumerações, para modelar seus dados.
Este guia inclui as seguintes seções:
O parâmetro de tipo genérico descreve a parametrização da coleção e a modelagem de dados
Modelo de Dados Personalizado descreve como definir tipos de Rust personalizados para modelar dados em suas coleções
Serialização personalizada descreve como modificar o comportamento padrão de serialização e desserialização usando atributos e fornece exemplos
Informações adicionais fornecem links para recursos e documentação da API para os tipos e métodos mencionados neste guia
Parâmetro de tipo genérico
Ao criar uma instância do Collection
, você deve especificar um parâmetro de tipo genérico para representar o tipo de dados que modela os documentos em sua coleção. Para saber mais sobre como especificar um parâmetro de tipo genérico, consulte a seção Parametrização de coleção do guia sobre bancos de dados e coleções.
Recomendamos que você defina e use um tipo personalizado para modelar os dados da sua coleção em vez de usar o tipo Document
.
Modelo de Dados Personalizado
Você pode usar qualquer tipo de dados Rust que implemente as características Serialize
e Deserialize
da caixa serde
como o parâmetro de tipo genérico para uma instância Collection
. Para implementar as características Serialize
e Deserialize
, você deve incluir o seguinte atributo derive
antes de definir um tipo de Rust:
Exemplo de estrutura personalizada
O código a seguir define uma estrutura Vegetable
de amostra que implementa as características de serialização serde
:
struct Vegetable { name: String, category: String, tropical: bool, }
O seguinte código acessa a collection vegetables
com Vegetable
como seu parâmetro de tipo genérico:
let my_coll: Collection<Vegetable> = client .database("db") .collection("vegetables");
Como a instância Collection
é parametrizada com a estrutura Vegetable
, você pode executar operações CRUD com esse tipo. O seguinte código insere uma instância do Vegetable
na coleção:
let calabash = Vegetable { name: "calabash".to_string(), category: "gourd".to_string(), tropical: true, }; my_coll.insert_one(calabash).await?;
Várias parametrizações
Se a sua collection contiver múltiplos esquemas, você poderá definir um tipo personalizado para modelar cada tipo de dados e criar clones da instância original do Collection
para cada tipo. Você pode criar clones de uma instância Collection
usando o método clone_with_type()
.
Suponha que você parametrizou originalmente uma coleção com uma estrutura chamada Square
, mas depois entende que deseja inserir um tipo diferente de dados, modelado pela estrutura Circle
, na coleção. O código a seguir parametriza uma collection com o tipo Square
e, em seguida, cria um clone da collection que é parametrizado com o tipo Circle
:
let shapes_coll: Collection<Square> = client .database("db") .collection("shapes"); // ... perform some operations with Square let shapes_coll: Collection<Circle> = shapes_coll.clone_with_type(); // ... perform some operations with Circle
Serialização personalizada
Você pode modificar o comportamento padrão de serialização e desserialização do driver Rust usando atributos da caixa serde
. Os atributos são partes opcionais de metadados anexadas a campos de estruturas ou variantes de enums.
A caixa serde
fornece os atributos serialize_with
e deserialize_with
, que aceitam funções de auxiliar como valores. Essas funções auxiliares personalizam a serialização e a desserialização em campos e variantes específicos. Para especificar um atributo em um campo, inclua o atributo antes da definição do campo:
struct MyStruct { field1: String, // ... other fields }
Nas seções seguintes, você pode encontrar exemplos que utilizam funções de ajuda da biblioteca do bson
para realizar tarefas de serialização comuns. Para ver uma lista completa dessas funções de ajuda, consulte a documentação da API serde_helpers.
Serializar uma string como um ObjectId
Talvez você queira representar o campo _id
em um documento como uma cadeia hexadecimal em sua estrutura. Para converter a cadeia hexadecimal para o tipo ObjectId
BSON, utilize a função auxiliar do serialize_hex_string_as_object_id
como o valor do atributo serialize_with
. O exemplo a seguir anexa o atributo serialize_with
ao campo _id
para que o driver serialize a string hexadecimal como um tipo ObjectId
:
struct Order { _id: String, item: String, }
Para ver como o driver serializa uma estrutura de exemplo Order
para BSON, selecione a partir das seguintes guias Struct e BSON :
let order = Order { _id: "6348acd2e1a47ca32e79f46f".to_string(), item: "lima beans".to_string(), };
{ "_id": { "$oid": "6348acd2e1a47ca32e79f46f" }, "item": "lima beans" }
Serializar um DateTime como uma string
Talvez você queira representar um valor de campo DateTime
em um documento como uma string formatada em ISO no BSON. Para especificar essa conversão, use a função auxiliar serialize_bson_datetime_as_rfc3339_string
como valor do atributo serialize_with
anexado ao campo com um valor DateTime
. O exemplo seguinte anexa o atributo serialize_with
ao campo delivery_date
para que o driver serialize o valor DateTime
para uma string:
struct Order { item: String, delivery_date: DateTime, }
Para ver como o driver serializa uma estrutura de exemplo Order
para BSON, selecione entre as seguintes guias Struct e BSON :
let order = Order { item: "lima beans".to_string(), delivery_date: DateTime::now(), };
{ "_id": { ... }, "item": "lima beans", "delivery_date": "2023-09-26T17:30:18.181Z" }
Serialize um u32 como um f64
Você pode querer representar um valor de campo u32
em um documento como um f64
ou Double
tipo em BSON. Para especificar essa conversão, use a função auxiliar serialize_u32_as_f64
como valor do atributo serialize_with
anexado ao campo com um valor u32
. O exemplo seguinte anexa o atributo serialize_with
ao campo quantity
para que o driver serialize o valor u32
para um tipo Double
:
struct Order { item: String, quantity: u32, }
Observação
A representação BSON Double
de um valor u32
aparece igual ao valor original.
Outros atributos e módulos
Além das funções auxiliares, a biblioteca bson
fornece módulos que lidam com a serialização e a desserialização. Para selecionar um módulo para usar em um campo ou variante específica, defina o valor do atributo with
para o nome do módulo:
struct MyStruct { field1: u32, // ... other fields }
Para obter uma lista completa desses módulos, consulte a documentação da API serde_helpers.
O crate serde
fornece muitos outros atributos para personalizar a serialização. A lista a seguir descreve alguns atributos comuns e sua funcionalidade:
rename
: serializar e desserializar um campo com um nome especificado em vez do nome da struct ou variante de Rustskip
: não serialize ou deserialize o campo especificadodefault
: se nenhum valor estiver presente durante a desserialização, use o valor padrão deDefault::default()
Para obter uma lista completa dos serde
atributos , consulte a documentação da API de atributos do serde .
Informações adicionais
Para saber mais sobre os tipos de BSON types, consulte BSON types de BSON no manual do servidor MongoDB.
Para obter mais exemplos que demonstram a funcionalidade serde
, consulte o artigo Structuring Data with Serde in Rust Developer Center.
Para saber mais sobre a estrutura do Serde, consulte a documentação do Serde.
Documentação da API
Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo:
serialize_with Atributo Serde
deserialize_with Atributo Serde
com Atributo Serde