Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Menu Docs
Página inicial do Docs
/ /

Substituir documentos

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

Para saber como atualizar campos específicos em documentos, consulte o guia Atualizar documentos.

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étodo

  • Informações adicionais fornecem links para recursos e documentação da API para os tipos e métodos mencionados neste guia

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.

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.

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>, ... }

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

matched_count

O número de documentos correspondidos pelo filtro

modified_count

O número de documentos modificados pela operação

upserted_id

O _id do documento atualizado ou vazio se não houver nenhum

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.

Esta seção fornece exemplos que demonstram como usar o método replace_one() para substituir documentos em uma coleçã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 name de "Susan Lee"

  • Um valor role de "Lead Consultant"

  • Um valor team_members de [ "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" ]
}

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> por replace_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> por replace_struct. A estrutura Restaurant é 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 };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
borough: String,
cuisine: String,
name: String,
}
#[tokio::main]
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 };
#[derive(Serialize, Deserialize, Debug)]
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

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

array_filters

The set of filters specifying the array elements to which the update applies.

Type: Vec<Document>

bypass_document_validation

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: bool
Default: false

upsert

If true, the operation inserts a document if no documents match the query filter.

Type: bool

collation

The collation to use when sorting results. To learn more about collations, see the Collations guide.

Type: Collation
Default: None

hint

The index to use for the operation.

Type: Hint
Default: None

write_concern

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

let_vars

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

comment

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: Bson
Default: 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?;

Para obter mais informações sobre os conceitos deste guia, consulte a seguinte documentação:

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

Voltar

Atualize documentos

Nesta página