Modificar documentos
Nesta página
- Visão geral
- Dados de amostra
- Atualizar operações
- Parâmetros necessários
- Atualizar um documento
- Atualizar muitos documentos
- Personalizar a operação de atualização
- Valor de retorno
- Exemplo
- Operação de substituição
- Parâmetros necessários
- Personalizar a operação de substituição
- Valor de retorno
- Exemplo
- Informações adicionais
- Documentação da API
Visão geral
Neste guia, mostraremos como usar o driver .NET/C## do MongoDB para modificar documentos em uma coleção do MongoDB realizando as seguintes operações:
O driver .NET/C# oferece os seguintes métodos para modificar documentos, cada um dos quais com uma versão assíncrona e síncrona:
UpdateOneAsync()
ouUpdateOne()
UpdateManyAsync()
ouUpdateMany()
ReplaceOneAsync()
ouReplaceOne()
Dica
Laboratório interativo
Esta página inclui um breve laboratório interativo que demonstra como modificar dados usando o método UpdateManyAsync()
. É possível concluir este laboratório diretamente na janela do seu navegador sem instalar o MongoDB ou um editor de código.
Para iniciar o laboratório, clique no botão Open Interactive Tutorial na parte superior da página. Para expandir o laboratório para um formato de tela inteira, clique no botão de tela inteira (⛶) no canto superior direito do painel do laboratório.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
a partir do banco de dados do sample_restaurants
. Os documentos nesta coleção usam as seguintes classes Restaurant
, Address
e GradeEntry
como modelos:
public class Restaurant { public ObjectId Id { get; set; } public string Name { get; set; } [ ] public string RestaurantId { get; set; } public string Cuisine { get; set; } public Address Address { get; set; } public string Borough { get; set; } public List<GradeEntry> Grades { get; set; } }
public class Address { public string Building { get; set; } [ ] public double[] Coordinates { get; set; } public string Street { get; set; } [ ] public string ZipCode { get; set; } }
public class GradeEntry { public DateTime Date { get; set; } public string Grade { get; set; } public float? Score { get; set; } }
Observação
Os documentos na collection restaurants
usam a convenção de nomenclatura snake-case. Os exemplos neste guia usam um ConventionPack
para desserializar os campos na coleção em maiúsculas e minúsculas Pascal e mapeá-los para as propriedades na classe Restaurant
.
Para saber mais sobre serialização personalizada, consulte Serialização personalizada.
Essa coleção é dos conjuntos de dados de amostra fornecidos pelo Atlas. Consulte o Quick Start para saber como criar um cluster MongoDB gratuito e carregar esses dados de amostra.
Atualizar operações
Você pode executar operações de atualização no MongoDB com os seguintes métodos:
UpdateOne()
, que atualiza o primeiro documento que corresponde aos critérios de pesquisaUpdateMany()
, que atualiza todos os documentos que correspondem aos critérios de pesquisa
Parâmetros necessários
Cada método de atualização exige os seguintes parâmetros:
Um documento de filtro de queries, que determina quais registros devem ser atualizados. Consulte o manual do servidor MongoDB para obter mais informações sobre filtros de queries.
Um documento de atualização, que especifica o operador de atualização (o tipo de atualização a ser executada) e os campos e valores que devem ser alterados. Consulte a página do Manual de operadores de atualização de campos para obter uma lista completa dos operadores de atualização e seu uso.
O driver .NET/C# fornece uma classe Builders
que simplifica a criação de filtros de queries e documentos de atualização. A amostra de código abaixo usa Builders
para criar dois documentos para utilizar como parâmetros em uma operação de atualização:
Um filtro de queries que pesquisa restaurantes com um valor do campo
cuisine
de "Pizza"Um documento de atualização que define o valor do campo
cuisine
desses restaurantes como "Massas e pães"
const string oldValue = "Pizza"; const string newValue = "Pasta and breadsticks"; // Creates a filter for all documents with a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(restaurant => restaurant.Cuisine, oldValue); // Creates instructions to update the "cuisine" field of documents that // match the filter var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Cuisine, newValue); // Updates all documents that have a "cuisine" value of "Pizza" return _restaurantsCollection.UpdateMany(filter, update);
Dica
Pipelines de agregação em operações de atualização
Se você estiver usando o MongoDB versão 4.2 ou posterior, poderá usar aggregation pipelines compostos por um subconjunto de estágios de aggregation em operações de atualização. Para obter mais informações sobre os estágios de aggregation que têm suporte do MongoDB em aggregation pipelines usados em operações de atualização, consulte nosso tutorial sobre como criar atualizações com aggregation pipelines.
Atualizar um documento
O código abaixo mostra como usar o método UpdateOneAsync()
assíncrono ou o método UpdateOne()
síncrono para atualizar um documento.
var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
var result = _restaurantsCollection.UpdateOne(filter, update);
Atualizar muitos documentos
O código abaixo mostra como usar o método UpdateManyAsync()
assíncrono ou o método UpdateMany()
síncrono para atualizar todos os documentos correspondentes.
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
var result = _restaurantsCollection.UpdateMany(filter, update);
Dica
Encontre exemplos executáveis que usam esses métodos em Informações adicionais.
Personalizar a operação de atualização
Ambos os métodos opcionalmente aceitam um objeto UpdateOptions
como um parâmetro adicional, que representa as opções que você pode usar para configurar a operação de atualização. Se você não especificar quaisquer propriedades do UpdateOptions
, o driver não personalizará a operação de atualização.
O tipo UpdateOptions
permite a você configurar opções com as seguintes propriedades:
Propriedade | Descrição |
---|---|
ArrayFilters | Specifies which array elements to modify for an update operation on an array field.
See the MongoDB server manual
for more information. |
BypassDocumentValidation | Specifies whether the update operation bypasses document validation. This lets you
update documents that don't meet the schema validation requirements, if any
exist. See the MongoDB server manual
for more information on schema validation. |
Collation | Specifies the kind of language collation to use when sorting
results. See the MongoDB server manual
for more information on collation. |
Comment | Gets or sets the user-provided comment for the operation.
See the MongoDB server manual
for more information. |
Hint | Gets or sets the index to use to scan for documents.
See the MongoDB server manual
for more information. |
IsUpsert | Specifies whether the update operation performs an upsert operation if no
documents match the query filter.
See the MongoDB server manual
for more information. |
Let | Gets or sets the let document.
See the MongoDB server manual
for more information. |
Valor de retorno
Os métodos UpdateOne()
e UpdateMany()
retornam um objeto UpdateResult
. O tipo UpdateResult
contém as seguintes propriedades:
Propriedade | Descrição |
---|---|
IsAcknowledged | Indicates whether the update operation was acknowledged by MongoDB. |
IsModifiedCountAvailable | Indicates whether you can read the count of updated records on the
UpdateResult . |
MatchedCount | The number of documents that matched the query filter, regardless of
how many were updated. |
ModifiedCount | The number of documents updated by the update operation. If an updated
document is identical to the original, it won't be included in this count. |
UpsertedId | The ID of the document that was upserted in the database, if the driver
performed an upsert. |
Exemplo
O código abaixo usa o método UpdateMany()
para encontrar todos os documentos onde o campo borough
tem o valor "Manhattan" e, em seguida, atualiza o valor borough
nesses documentos para "Manhattan (norte)". Como a opção IsUpsert
está definida como true
, o driver insere um novo documento se o filtro de queries não corresponder a nenhum documento existente.
var filter = Builders<Restaurant>.Filter .Eq(restaurant => restaurant.Borough, "Manhattan"); var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Borough, "Manhattan (north)"); UpdateOptions opts = new UpdateOptions() { Comment = new BsonString("Borough updated for C# Driver Fundamentals"), IsUpsert = true }; Console.WriteLine("Updating documents..."); var result = _restaurantsCollection.UpdateMany(filter, update, opts); Console.WriteLine($"Updated documents: {result.ModifiedCount}"); Console.WriteLine($"Result acknowledged? {result.IsAcknowledged}");
Updating documents... Updated documents: 10259 Result acknowledged? True
Observação
Se o exemplo anterior usasse o método UpdateOne()
em vez de UpdateMany()
, o driver atualizaria somente o primeiro dos documentos correspondentes.
Operação de substituição
Você pode executar uma operação de substituição no MongoDB com o método ReplaceOne()
. Esse método remove todos os campos (exceto o campo _id
) do primeiro documento que corresponde aos critérios de pesquisa e, em seguida, insere os campos e valores especificados no documento.
Parâmetros necessários
O método ReplaceOne()
exige os seguintes parâmetros:
Um documento de filtro de queries, que determina qual registro substituir.
Um documento de substituição, que especifica os campos e valores a serem inseridos no novo documento. Se os documentos em sua coleção forem mapeados para uma classe C#, o documento de substituição poderá ser uma instância dessa classe.
Como em uma operação de atualização, você pode utilizar a classe Builders
no Driver .NET/C# para criar um filtro de queries. A seguinte amostra de código utiliza Builders
para criar um filtro de queries que pesquisa restaurantes com um valor de campo name
de "Pizza Town". O código também cria um novo objeto Restaurant
que substituirá o primeiro documento correspondente.
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; // Replaces the existing restaurant document with the new document return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant);
Importante
Os valores dos campos _id
são imutáveis. Se o documento de substituição especificar um valor para o campo _id
, ele deverá corresponder ao valor _id
do documento existente.
O código abaixo mostra como usar o método ReplaceOneAsync()
assíncrono ou o método ReplaceOne()
síncrono para substituir um documento.
var result = await _restaurantsCollection.ReplaceOneAsync(filter, newRestaurant);
var result = _restaurantsCollection.ReplaceOne(filter, newRestaurant);
Dica
Encontre exemplos executáveis que usam esses métodos em Informações adicionais.
Personalizar a operação de substituição
O método ReplaceOne()
aceita opcionalmente um objeto ReplaceOptions
como parâmetro adicional, que representa as opções que você pode usar para configurar a operação de substituição. Se você não especificar quaisquer propriedades do ReplaceOptions
, o driver não personalizará a operação de substituição.
O tipo ReplaceOptions
permite a você configurar opções com as seguintes propriedades:
Propriedade | Descrição |
---|---|
BypassDocumentValidation | Specifies whether the replace operation bypasses document validation. This lets you
replace documents that don't meet the schema validation requirements, if any
exist. See the MongoDB server manual
for more information on schema validation. |
Collation | Specifies the kind of language collation to use when sorting
results. See the MongoDB server manual
for more information on collation. |
Comment | Gets or sets the user-provided comment for the operation.
See the MongoDB server manual
for more information. |
Hint | Gets or sets the index to use to scan for documents.
See the MongoDB server manual
for more information. |
IsUpsert | Specifies whether the replace operation performs an upsert operation if no
documents match the query filter.
See the MongoDB server manual
for more information. |
Let | Gets or sets the let document.
See the MongoDB server manual
for more information. |
Valor de retorno
O método ReplaceOne()
retorna um objeto ReplaceOneResult
. O tipo ReplaceOneResult
contém as seguintes propriedades:
Propriedade | Descrição |
---|---|
IsAcknowledged | Indicates whether the replace operation was acknowledged by MongoDB. |
IsModifiedCountAvailable | Indicates whether you can read the count of replaced records on the
ReplaceOneResult . |
MatchedCount | The number of documents that matched the query filter, regardless of
whether one was replaced. |
ModifiedCount | The number of documents replaced by the replace operation. |
UpsertedId | The ID of the document that was upserted in the database, if the driver
performed an upsert. |
Exemplo
O código abaixo usa o método ReplaceOne()
para localizar o primeiro documento onde o campo name
tem o valor "Pizza Town" e, em seguida, substitui este documento por um novo documento Restaurant
chamado "Food World". Como a opção IsUpsert
está definida como true
, o driver insere um novo documento se o filtro de queries não corresponder a nenhum documento existente.
var filter = Builders<Restaurant>.Filter.Eq(restaurant => restaurant.Name, "Pizza Town"); Restaurant newRestaurant = new() { Name = "Food World", Cuisine = "American", Address = new BsonDocument { {"street", "Food St"}, {"zipcode", "10003"}, }, Borough = "Manhattan", }; ReplaceOptions opts = new ReplaceOptions() { Comment = new BsonString("Restaurant replaced for .NET/C# Driver Fundamentals"), IsUpsert = true }; Console.WriteLine("Replacing document..."); var result = _restaurantsCollection.ReplaceOne(filter, newRestaurant, opts); Console.WriteLine($"Replaced documents: {result.ModifiedCount}"); Console.WriteLine($"Result acknowledged? {result.IsAcknowledged}");
Replacing document... Replaced documents: 1 Result acknowledged? True
Informações adicionais
Para exemplos executáveis da atualização e substituição de operações, consulte os seguintes exemplos de uso:
Para saber mais sobre como criar filtros de queries, consulte o guia Especifique uma consulta.
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: