Visão geral
Neste guia, você aprenderá a usar o driver Rust para substituir documentos em uma collection do MongoDB usando o método replace_one().
As operações de substituição removem todos os campos existentes de um documento, exceto o campo _id, e substituem os campos removidos por novos campos e valores.
Observação
Este guia inclui as seguintes seções:
Substituir um documento descreve como usar o driver para executar operações de substituição
Modificar Comportamento de Substituição descreve como modificar o comportamento padrão do
replace_one()métodoInformações adicionais fornecem links para recursos e documentação da API para os tipos e métodos mencionados neste guia
O campo _id
Cada documento em uma coleção MongoDB tem um campo _id exclusivo e imutável. Se você tentar alterar o campo _id por meio de uma operação de substituição, o driver gerará um WriteError e não executará atualizações.
Substituir um documento
Você pode executar uma operação de substituição com o método replace_one(). Este método remove todos os campos existentes de um documento , exceto o campo _id, e substitui os campos removidos por novos campos e valores que você especifica.
Você também pode encadear métodos construtores de opções ao replace_one() método. Para saber mais sobre como modificar o comportamento desse método, consulte a seção Modificar comportamento de substituição deste guia.
Dica
Você pode recuperar e modificar dados em uma ação usando operações compostas. Para saber mais, consulte o guia sobre operações compostas.
Parâmetros
O método replace_one() utiliza os seguintes parâmetros:
Filtro de consulta para corresponder ao documento a ser substituído
Documentos de substituição que contêm os campos e valores que substituirão um documento existente
Os documentos de substituição usam o seguinte formato:
doc! { "<field>": <value>, "<field>": <value>, ... }
Valor de retorno
O método replace_one() retorna um tipo UpdateResult se a operação for bem-sucedida. O tipo UpdateResult contém as seguintes propriedades que descrevem a operação:
Propriedade | Descrição |
|---|---|
| O número de documentos correspondidos pelo filtro |
| O número de documentos modificados pela operação |
| O |
Se vários documentos corresponderem ao filtro de query que você passa para replace_one(), o método selecionará e substituirá o primeiro documento correspondente. Se nenhum documento corresponder ao filtro de query, a operação de substituição não fará alterações.
Exemplos
Esta seção fornece exemplos que demonstram como usar o método replace_one() para substituir documentos em uma coleção.
Exemplo de substituição
O seguinte documento descreve um funcionário de uma empresa:
{ "_id": ObjectId('4501'), "name": "Matt DeGuy", "role": "Consultant", "team_members": [ "Jill Gillison", "Susan Lee" ] }
Este exemplo utiliza o método replace_one() para substituir o documento anterior por um que tenha os seguintes campos:
Um valor
namede"Susan Lee"Um valor
rolede"Lead Consultant"Um valor
team_membersde[ "Jill Gillison" ]
let replace_doc = doc! { "name": "Susan Lee", "role": "Lead Consultant", "team_members": vec! [ "Jill Gillison" ] }; let res = my_coll .replace_one(doc! { "name": "Matt DeGuy" }, replace_doc) .await?; println!( "Matched documents: {}\nModified documents: {}", res.matched_count, res.modified_count );
Matched documents: 1 Modified documents: 1
O documento substituído contém o conteúdo do documento de substituição e o campo _id imutável:
{ "_id": ObjectId('4501'), "name": "Susan Lee", "role": "Lead Consultant", "team_members": [ "Jill Gillison" ] }
Exemplo de arquivo completo: substituir um documento
Este exemplo substitui um documento na coleção restaurants do banco de dados sample_restaurants. O método replace_one() substitui o primeiro documento no qual o valor do campo name é "Landmark Coffee Shop" por um novo documento.
Você pode acessar os documentos na coleção restaurants como instâncias do tipo Document ou um tipo de dados personalizado. Para especificar qual tipo de dados representa os dados da coleção, execute as seguintes ações nas linhas realçadas:
Para acessar documentos de coleção como documentos BSON, substitua o parâmetro de tipo
<T>por<Document>e o espaço reservado<struct or doc>porreplace_doc.Para acessar documentos de coleção como instâncias da estrutura
Restaurant, substitua o parâmetro de tipo<T>por<Restaurant>e o espaço reservado<struct or doc>porreplace_struct. A estruturaRestauranté definida no topo do arquivo de código.
Selecione a aba Asynchronous ou Synchronous para ver o código correspondente para cada tempo de execução:
use std::env; use mongodb::{ bson::doc, Client, Collection }; use serde::{ Deserialize, Serialize }; struct Restaurant { borough: String, cuisine: String, name: String, } async fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri).await?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let filter = doc! { "name": "Landmark Coffee Shop" }; let replace_doc = doc! { "borough": "Brooklyn", "cuisine": "Café/Coffee/Tea", "name": "Harvest Moon Café", }; let replace_struct = Restaurant { borough: "Brooklyn".to_string(), cuisine: "Café/Coffee/Tea".to_string(), name: "Harvest Moon Café".to_string(), }; // Replace <struct or doc> with the replace_struct or replace_doc variable let res = my_coll.replace_one(filter, <struct or doc>).await?; println!("Replaced documents: {}", res.modified_count); Ok(()) }
Replaced documents: 1
use std::env; use mongodb::{ bson::doc, sync::{ Client, Collection } }; use serde::{ Deserialize, Serialize }; struct Restaurant { borough: String, cuisine: String, name: String, } fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri)?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let filter = doc! { "name": "Landmark Coffee Shop" }; let replace_doc = doc! { "borough": "Brooklyn", "cuisine": "Café/Coffee/Tea", "name": "Harvest Moon Café", }; let replace_struct = Restaurant { borough: "Brooklyn".to_string(), cuisine: "Café/Coffee/Tea".to_string(), name: "Harvest Moon Café".to_string(), }; // Replace <struct or doc> with the replace_struct or replace_doc variable let res = my_coll.replace_one(filter, <struct or doc>).run()?; println!("Replaced documents: {}", res.modified_count); Ok(()) }
Replaced documents: 1
Modificar comportamento de substituição
Você pode modificar o comportamento do método replace_one() chamando métodos de opções que definem campos de estrutura ReplaceOptions .
Observação
Opções de configuração
Você pode definir ReplaceOptions campos encadeando métodos de construtor de opções diretamente à chamada de método replace_one() . Se você estiver utilizando uma versão anterior do driver, você deverá construir uma instância do ReplaceOptions encadeando métodos de construtor de opção ao método builder() . Em seguida, passe a instância de opções como parâmetro para replace_one().
A tabela a seguir descreve as opções disponíveis em ReplaceOptions:
Opção | Descrição |
|---|---|
| The set of filters specifying the array elements to which the
update applies. Type: Vec<Document> |
| If true, allows the driver to perform a write that violates
document-level validation. To learn more about validation, see
the guide on Schema Validation.Type: boolDefault: false |
| If true, the operation inserts a document if no documents match
the query filter.Type: bool |
| The collation to use when sorting results. To learn more about collations,
see the Collations guide. Type: CollationDefault: None |
| The index to use for the operation. Type: HintDefault: None |
| The write concern for the operation. If you don't set this
option, the operation inherits the write concern set for
the collection. To learn more about write concerns, see
Write Concern in the
MongoDB Server manual. Type: WriteConcern |
| A map of parameters and values. These parameters can be accessed
as variables in aggregation expressions. This option is available
only when connecting to MongoDB Server versions 5.0 and later. Type: Document |
| An arbitrary Bson value tied to the operation to trace
it through the database profiler, currentOp, and
logs. This option is available only when connecting to
MongoDB Server versions 4.4 and later.Type: BsonDefault: None |
O código a seguir mostra como definir o campo upsert encadeando o método upsert() ao método replace_one() :
let res = my_coll .replace_one(filter_doc, replace_doc) .upsert(true) .await?;
Informações adicionais
Para obter mais informações sobre os conceitos deste guia, consulte a seguinte documentação:
Atualizar guiade documentos
Documentação da API
Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo: