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
Visão geral
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
Atualizar padrão do documento
No MongoDB, todos os métodos para alterar documentos seguem o mesmo padrão:
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.
O campo _id
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.
Atualize documentos
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 pesquisaupdate_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.
Parâmetros
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.
Valor de retorno
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.
Exemplo de atualização
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 dedepartment
para"Business Operations"
erole
para"Analytics Specialist"
Um operador
$inc
para aumentar o valor debonus
em500
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 }
Atualizar por exemplo do ObjectId
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.
Substituir um documento
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.
Parâmetros
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>, ... }
Return Values
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.
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
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" ] }
Modificar atualização e substituir comportamento
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?;
Informações adicionais
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.
Documentação da API
Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo: