Menu Docs
Página inicial do Docs
/ / /
C#/.NET
/ / /

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

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:

  • Atualizar operações

  • Operações de substituição

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() ou UpdateOne()

  • UpdateManyAsync() ou UpdateMany()

  • ReplaceOneAsync() ou ReplaceOne()

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.

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; }
[BsonElement("restaurant_id")]
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; }
[BsonElement("coord")]
public double[] Coordinates { get; set; }
public string Street { get; set; }
[BsonElement("zipcode")]
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.

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 pesquisa

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

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.

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);

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.

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.

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.

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.

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.

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.

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.

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.

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

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.

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Insert