Menu Docs
Página inicial do Docs
/ / /
Driver Rust
/

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

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 bson biblioteca 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

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 .

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:

#[derive(Serialize, Deserialize)]

O código a seguir define uma estrutura Vegetable de amostra que implementa as características de serialização serde :

#[derive(Serialize, Deserialize)]
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?;

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

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:

#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(serialize_with = "<helper function>")]
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.

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 :

#[derive(Serialize, Deserialize)]
struct Order {
#[serde(serialize_with = "serialize_hex_string_as_object_id")]
_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"
}

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:

#[derive(Serialize, Deserialize)]
struct Order {
item: String,
#[serde(serialize_with = "serialize_bson_datetime_as_rfc3339_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"
}

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 :

#[derive(Serialize, Deserialize)]
struct Order {
item: String,
#[serde(serialize_with = "serialize_u32_as_f64")]
quantity: u32,
}

Observação

A representação BSON Double de um valor u32 aparece igual ao valor original.

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:

#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(with = "<module>")]
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 Rust

  • skip: não serialize ou deserialize o campo especificado

  • default: se nenhum valor estiver presente durante a desserialização, use o valor padrão de Default::default()

Para obter uma lista completa dos serde atributos , consulte a documentação da API de atributos do serde .

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.

Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo:

Voltar

Operações compostas