Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Menu Docs

Substituir documentos

Neste guia, você aprenderá a usar o driver Rust para substituir documentos em uma coleção 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:

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 método replace_one(). Para aprender 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 queries 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 guia 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

O conjunto de filtros que especificam os elementos de array aos quais a atualização se aplica.

Tipo: Vec<Document>

bypass_document_validation

trueSe, permite que o driver execute uma gravação que viole a validação em nível de documento. Para saber mais sobre validação, consulte o guia sobre Validação de Esquema.

Tipo: bool
Padrão: false

upsert

trueSe, a operação insere um documento se nenhum documento corresponder ao filtro de query.

Tipo: bool

collation

O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte o Guia de agrupamentos.

Tipo: Collation
Padrão: None

hint

O índice a ser usado para a operação.

Tipo: Hint
Padrão: None

write_concern

A preocupação de gravação para a operação. Se você não definir essa opção, a operação herdará o preocupação de gravação definido para a coleção. Para saber mais sobre write concerns, consulte Write Concern no manual do MongoDB Server .

Tipo: WriteConcern

let_vars

Um mapa de parâmetros e valores. Estes parâmetros podem ser acessados como variáveis em expressões de agregação . Esta opção está disponível somente ao conectar às versões 5.0 e posteriores do MongoDB Server .

Tipo: Document

comment

Um Bson valor arbitrário vinculado à operação para rastreá-la por meio do profiler de banco de dados, currentOp e registros. Esta opção está disponível somente ao conectar às versões 4.4 e posteriores do MongoDB Server .

Tipo: Bson
Padrão: 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: