Visão geral
Neste guia, você aprenderá a usar o driver Ruby para atualizar documentos em uma collection do MongoDB usando os métodos update_one
e update_many
.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados do sample_restaurants
a partir dosconjuntos de dados de amostra do Atlas. Para acessar essa coleção a partir do seu aplicação Ruby, crie um objeto Mongo::Client
que se conecte a um Atlas cluster e atribua os seguintes valores às suas variáveis database
e collection
:
database = client.use('sample_restaurants') collection = database[:restaurants]
Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Atualizar operações
Você pode atualizar documentos no MongoDB com os seguintes métodos:
update_one
: Atualiza o primeiro documento que corresponde aos critérios de pesquisaupdate_many
: Atualiza todos os documentos que correspondem aos critérios de pesquisa
Cada método de atualização exige os seguintes parâmetros:
Filtro de query , que corresponde aos documentos que você deseja atualizar. Para saber mais sobre filtros de query, consulte o guia Especificar uma query.
documento de atualização , que especifica o operador de atualização e os campos e valores a serem atualizados. O operador de atualização especifica o tipo de atualização a ser executada. Para visualizar uma lista de operadores de atualização e saber mais sobre seus usos, consulte a página do guia Operadores de atualização de campo no manual do MongoDB Server .
Atualizar um exemplo de documento
O exemplo a seguir usa o método update_one
para localizar o primeiro documento em que o valor do campo name
é "Happy Garden"
. Em seguida, ele usa o operador $set
para atualizar o valor do campo name
para "Mountain House"
.
filter = { name: 'Happy Garden' } update = { '$set' => { name: 'Mountain House' } } single_result = collection.update_one(filter, update) puts "#{single_result.modified_count} document(s) updated."
1 document(s) updated
Exemplo de atualização de muitos documentos
O exemplo seguinte utiliza o método update_many
para atualizar todos os documentos onde o valor do campo name
é "Starbucks"
. O documento de atualização usa o operador $rename
para alterar o nome do campo address
para location
.
filter = { name: 'Starbucks' } update = { '$rename' => { address: 'location' } } many_result = collection.update_many(filter, update) puts "#{many_result.modified_count} document(s) updated."
11 document(s) updated
Personalizar a operação de atualização
Os métodos update_one
e update_many
aceitam opções para configurar a operação de atualização. Você pode passar essas opções individualmente como parâmetros ou pode criar um objeto Hash
que contenha as opções e passar o objeto como um parâmetro. Se você não especificar nenhuma opção, o driver executará a operação de atualização com as configurações padrão.
A tabela a seguir descreve as opções que você pode usar para configurar a operação de atualização:
Opção | Descrição |
---|---|
| Whether the update operation performs an upsert operation if no
documents match the query filter. For more information, see the upsert
statement
in the MongoDB Server manual. Default: false |
| Whether the update operation bypasses document validation. This lets you
update documents that don't meet the schema validation requirements, if any
exist. For more information about schema validation, see Schema
Validation in the MongoDB
Server manual. Default: false |
| Language collation to use when sorting
results. For more information, see Collation
in the MongoDB Server manual. |
| List of filters that you specify to select which
array elements the update applies to. |
| Index to use when matching documents.
For more information, see the hint statement
in the MongoDB Server manual. |
| Map of parameter names and values to set top-level
variables for the operation. Values must be constant or closed
expressions that don't reference document fields. For more information,
see the let statement in the
MongoDB Server manual. |
Exemplo de modificação de atualização
O exemplo utiliza o operador $equal
para corresponder a documentos onde o valor do campo name
é "Sunrise Pizzeria"
. Em seguida, ele usa o operador $set
para definir o valor do campo borough
no primeiro documento correspondente como "Queens"
e o valor do campo cuisine
como "Italian"
.
Como a opção upsert
está definida como true
, se o filtro de query não corresponder a nenhum documento existente, o driver insere um novo documento que contém os campos e valores no filtro e atualiza os documentos.
filter = { 'name' => 'Sunrise Pizzeria' } update = { '$set' => { borough: 'Queens', cuisine: 'Italian' } } upsert_result = collection.update_one(filter, update, upsert: true) puts "#{upsert_result.modified_count} document(s) updated."
1 document(s) updated
Valor de retorno
Os métodos update_one
e update_many
retornam um objeto Result
. Você pode acessar os seguintes métodos a partir de uma instância Result
:
Método | Descrição |
---|---|
| Number of documents that matched the query filter, regardless of
how many updates were performed. |
| Number of documents modified by the update operation. If an updated
document is identical to the original, it is not included in this
count. |
| Returns true if the server acknowledged the result. |
| Returns the number of documents that were upserted in the database, if the driver
performed an upsert. |
| Returns the _id value of the document that was upserted
in the database, if the driver performed an upsert. |
Dica
Verifique o valor do método acknowledged?
antes de tentar chamar qualquer outro método Result
. Se o método acknowledged?
retornar false
, o driver lançará uma exceção InvalidOperation
se você tentar chamar qualquer outro método no objeto Result
. O driver não pode determinar esses valores se o servidor não reconhecer a operação de gravação.
Informações adicionais
Para exibir exemplos de código executáveis que demonstram como atualizar documentos usando o driver Ruby, consulte Gravar dados no MongoDB.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: