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

Modificar documentos

Nesta página

  • Visão geral
  • Atualizar padrão do documento
  • O campo _id
  • Atualize documentos
  • Parâmetros
  • Valor de retorno
  • Exemplo de atualização
  • Atualizar por exemplo do ObjectId
  • Substituir um documento
  • Parâmetros
  • Return Values
  • Exemplo de substituição
  • Modificar atualização e substituir comportamento
  • Informações adicionais
  • Documentação da API

Neste guia, você pode aprender como modificar documentos no MongoDB usando a atualização e substituição de operações.

As operações de atualização alteram os campos que você especifica, deixando outros campos e valores inalterados. A substituição de operações remove todos os campos existentes de um documento, exceto o campo _id e substitui os campos removidos por novos campos e valores.

Este guia inclui as seguintes seções:

  • Atualizar documentos descreve como usar o driver para executar operações de atualização

  • Substituir um documento descreve como usar o driver para executar operações de substituição

  • Modificar comportamento de atualização e substituição descreve como modificar o comportamento padrão dos métodos descritos neste guia

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

No MongoDB, todos os métodos para alterar documentos seguem o mesmo padrão:

assinatura do método changeX()

Observação

changeX() é um espaço reservado e não um método real.

Esses métodos usam os seguintes parâmetros:

  • Um filtro de query para corresponder a um ou mais documentos a serem alterados

  • Um documento de atualização que especifica as alterações de campo e valor

O driver Rust oferece os seguintes métodos para alterar documentos:

  • update_one()

  • update_many()

  • replace_one()

Você pode recuperar e modificar dados em uma ação usando operações compostas. Para saber mais, consulte o guia sobre Operações compostas.

Cada documento em uma MongoDB collection tem um campo _id exclusivo e imutável. Se você tentar alterar o campo _id por meio de uma operação de atualização ou substituição, o driver gerará um WriteError e não executará atualizações.

Você pode realizar operações de atualização usando os seguintes métodos:

  • update_one(), que atualiza o primeiro documento que corresponde aos critérios de pesquisa

  • update_many(), que atualiza todos os documentos que correspondem aos critérios de pesquisa

Você também pode encadear métodos construtores de opções a esses métodos de operação de atualização. Para saber mais sobre como modificar o comportamento dos métodos de atualização, consulte a seção Modificar comportamento de atualização e substituição deste guia.

Cada método utiliza um filtro de query e um documento de atualização que inclui pelo menos um operador de atualização. O operador de atualização especifica o tipo de atualização a ser executada e inclui os campos e valores que descrevem a alteração. Atualize os documentos usando o seguinte formato:

doc! { "<update operator>": doc! { "<field>": <value> } }

Para especificar várias atualizações em um documento de atualização, use o seguinte formato:

doc! {
"<update operator>": doc!{"<field>": <value>},
"<update operator>": doc!{"<field>": <value>},
...
}

Consulte o manual do servidor MongoDB para obter uma lista completa de operadores de atualização e descrições.

Observação

Pipelines de agregação em operações de atualização

Se você estiver usando o MongoDB Server versão 4.2 ou posterior, poderá usar aggregation pipelines em operações de atualização. Para saber mais sobre os estágios de aggregation que têm suporte do MongoDB em aggregation pipelines, consulte nosso tutorial sobre como executar atualizações com aggregation pipelines.

Os métodos update_one() e update_many() retornam 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 UpdateOne(), o método selecionará e atualizará o primeiro documento correspondente. Se nenhum documento corresponder ao filtro de query, a operação de atualização não fará alterações.

Os seguintes documentos descrevem os funcionários de uma empresa:

{
"_id": ObjectId('4337'),
"name": "Shelley Olson",
"department": "Marketing",
"role": "Director",
"bonus": 3000
},
{
"_id": ObjectId('4902'),
"name": "Remi Ibrahim",
"department": "Marketing",
"role": "Consultant",
"bonus": 1800
}

Este exemplo executa uma operação de atualização com o método update_many() . O método update_many() utiliza os seguintes parâmetros:

  • Um filtro de query para corresponder a documentos onde o valor do campo department é "Marketing"

  • Um documento de atualização que contém as seguintes atualizações:

    • Um operador $set para alterar o valor de department para "Business Operations" e role para "Analytics Specialist"

    • Um operador $inc para aumentar o valor de bonus em 500

let update_doc = doc! {
"$set": doc! { "department": "Business Operations",
"role": "Analytics Specialist" },
"$inc": doc! { "bonus": 500 }
};
let res = my_coll
.update_many(doc! { "department": "Marketing" }, update_doc)
.await?;
println!("Modified documents: {}", res.modified_count);
Modified documents: 2

Os seguintes documentos refletem as alterações resultantes da operação de atualização anterior:

{
"_id": ObjectId('4337'),
"name": "Shelley Olson",
"department": "Business Operations",
"role": "Analytics Specialist",
"bonus": 3500
},
{
"_id": ObjectId('4902'),
"name": "Remi Ibrahim",
"department": "Business Operations",
"role": "Analytics Specialist",
"bonus": 2300
}

O seguinte documento descreve um funcionário de uma empresa:

{
"_id": ObjectId('4274'),
"name": "Jill Millerton",
"department": "Marketing",
"role": "Consultant"
}

Este exemplo query o documento anterior especificando um filtro de query para corresponder ao valor _id exclusivo do documento. Em seguida, o código executa uma operação de atualização com o método update_one() . O método update_one() utiliza os seguintes parâmetros:

  • Filtro de query que corresponde a um documento no qual o valor do campo _id é ObjectId('4274')

  • Atualizar documento que cria instruções para definir o valor de name para "Jill Gillison"

let id = ObjectId::from_str("4274").expect("Could not convert to ObjectId");
let filter_doc = doc! { "_id": id };
let update_doc = doc! {
"$set": doc! { "name": "Jill Gillison" }
};
let res = my_coll
.update_one(filter_doc, update_doc)
.await?;
println!("Modified documents: {}", res.modified_count);
Modified documents: 1

O documento a seguir reflete as alterações resultantes da operação de atualização anterior:

{
"_id": ObjectId('4274'),
"name": "Jill Gillison",
"department": "Marketing",
"role": "Consultant"
}

Dica

Para saber mais sobre o campo _id , consulte a seção _id Field desta página ou a documentação do método ObjectId() no manual do servidor.

Você pode executar uma operação de substituição pelo método replace_one() . Este método substitui todos os campos existentes de um documento, exceto o campo _id por novos campos e valores que você especifica.

Você também pode encadear métodos construtores de opções a um método de operação de substituição. Para saber mais sobre como modificar o comportamento do método replace_one() , consulte a seção Modificar comportamento de atualização e substituição deste guia.

O método replace_one() usa um filtro de query e um documento 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.

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" ]
}

Você pode modificar o comportamento dos métodos update_one(), update_many e replace_one() chamando métodos de opções que definem campos de estrutura UpdateOptions .

Observação

Opções de configuração

Você pode definir UpdateOptions campos encadeando métodos construtores de opções diretamente à chamada de método de atualização ou substituição. Se você estiver utilizando uma versão anterior do driver, você deverá construir uma instância do UpdateOptions encadeando métodos de construtor de opção ao método builder() . Em seguida, passe sua instância de opções como um parâmetro para update_one(), update_many ou replace_one().

A tabela a seguir descreve as opções disponíveis em UpdateOptions:

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. This option is available only when connecting to MongoDB Server versions 4.2 and later.

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 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 update_one() :

let res = my_coll
.update_one(filter_doc, update_doc)
.upsert(true)
.await?;

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

Para exemplos executáveis da atualização e substituição de operações, consulte os seguintes exemplos de uso:

Para saber mais sobre os operadores de atualização, consulte Operadores de atualização no manual do servidor.

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

Voltar

Insert