Visão geral
Nesta página, você pode aprender como usar o Driver MongoDB .NET/C# para atualizar campos em vários documentos MongoDB . Esta página descreve como criar objetos UpdateDefinition<TDocument>
que especificam as operações de atualização que você deseja executar nos campos. Você pode passar esses objetos para os métodos de atualização descritos na página Atualizar muitos.
O driver .NET/C# é compatível com os operadores de atualização de campo descritos no manual do MongoDB Server. Para especificar uma operação de atualização, chame o método correspondente da propriedade Builders.Update
. As seções a seguir descrevem esses métodos em mais detalhes.
Observação
Sobrecargas de método
Muitos dos métodos nesta página têm múltiplas sobrecargas. Os exemplos deste guia mostram apenas uma definição de cada método. Para obter mais informações sobre as sobrecargas disponíveis,consulte a documentação da API.
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 collection é dos conjuntos de dados de amostra fornecidos pelo Atlas. Consulte a Introdução ao driver .NET/C# para saber como criar um cluster MongoDB gratuito e carregar esses dados de exemplo.
Incrementar um valor
Para incrementar o valor de um campo em um valor específico, chame o método Builders.Update.Inc()
. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser incrementado. Tipo de Dados: |
| O valor pelo qual incrementar o campo . Tipo de Dados: |
O exemplo de código a seguir usa o método Inc()
para incrementar o valor Score
em 2
no primeiro objeto GradeEntry
da array Grades
em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Inc(restaurant => restaurant.Grades[0].Score, 2); var result = _restaurantsCollection.UpdateMany(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Inc(restaurant => restaurant.Grades[0].Score, 2); var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
Multiplicar um valor
Para multiplicar o valor de um campo por um valor específico, chame o método Builders.Update.Mul()
. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser atualizado. Tipo de Dados: |
| O valor pelo qual multiplicar o campo . Tipo de Dados: |
O exemplo de código a seguir usa o método Mul()
para multiplicar o valor Score
por 1.25
no primeiro objeto GradeEntry
da array Grades
em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Mul(restaurant => restaurant.Grades[0].Score, 1.25f); var result = _restaurantsCollection.UpdateMany(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Mul(restaurant => restaurant.Grades[0].Score, 1.25f); var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
Renomear um campo
Para renomear um campo, chame o método Builders.Update.Rename()
. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser renomeado. Tipo de Dados: |
| O novo nome do campo. Tipo de Dados: |
O seguinte exemplo de código utiliza o método Rename()
para renomear o campo Address
para location
em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Rename(restaurant => restaurant.Address, "location"); var result = _restaurantsCollection.UpdateMany(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Rename(restaurant => restaurant.Address, "location"); var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
Observação
Os exemplos de código anteriores usam o nome de campo location
porque ele corresponde ao esquema de nomenclatura dos nomes de campo no MongoDB, não aos nomes da propriedade na classe Restaurant
.
Definir um valor
Para definir o valor de um campo para um valor específico, chame o método Builders.Update.Set()
. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser atualizado. Tipo de Dados: |
| O valor para o qual definir o campo . Tipo de Dados: |
O seguinte exemplo de código utiliza o método Set()
para renomear o campo recommended
para true
em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Set("recommended", true); var result = _restaurantsCollection.UpdateMany(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Set("recommended", true); var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
Observação
Os exemplos de código anteriores usam o nome de campo recommended
porque ele corresponde ao esquema de nomenclatura dos nomes de campo no MongoDB, não aos nomes da propriedade na classe Restaurant
.
Definir por comparação
Para atualizar o valor do campo para um valor especificado, mas somente se o valor especificado for maior que o valor atual do campo, chame o Builders.Update.Max()
método. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser atualizado. Tipo de Dados: |
| O valor para o qual definir o campo . Tipo de Dados: |
Para atualizar o valor do campo para um valor especificado, mas somente se o valor especificado for menor que o valor atual do campo, chame o Builders.Update.Min()
método. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser atualizado. Tipo de Dados: |
| O valor para o qual definir o campo . Tipo de Dados: |
O exemplo de código a seguir usa o método Max()
para definir o campo Score
do primeiro objeto GradeEntry
como o maior de 20
e o valor atual em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Max(restaurant => restaurant.Grades[0].Score, 20); var result = _restaurantsCollection.UpdateMany(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Max(restaurant => restaurant.Grades[0].Score, 20); var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
Definir na inserção
Para definir o valor de um campo somente se o documento foi atualizado pela mesma operação, chame o método Builders.Update.SetOnInsert()
. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser atualizado. Tipo de Dados: |
| O valor para o qual definir o campo . Tipo de Dados: |
O seguinte exemplo de código utiliza o método SetOnInsert()
para definir o campo recommended
como true
em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Patty's Pies"); var update = Builders<Restaurant>.Update .SetOnInsert("recommended", true); var result = _restaurantsCollection.UpdateMany( filter, update, new UpdateOptions { IsUpsert = true } );
var filter = Builders<Restaurant>.Filter.Eq("name", "Patty's Pies"); var update = Builders<Restaurant>.Update .SetOnInsert("recommended", true); var result = await _restaurantsCollection.UpdateManyAsync( filter, update, new UpdateOptions { IsUpsert = true } );
Observação
Os exemplos de código anteriores usam o nome de campo recommended
porque ele corresponde ao esquema de nomenclatura dos nomes de campo no MongoDB, não aos nomes da propriedade na classe Restaurant
.
Para saber mais sobre como atualizar documentos, consulte Opções de configuração no guia Atualizar muitos.
Definir a data atual
Para definir o valor de um campo para a data e hora atuais, chame o método Builders.Update.CurrentDate()
. Este método aceita os seguintes parâmetros:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser atualizado. Tipo de Dados: |
| O formato da data e hora, definido no enumeração Tipo de Dados: UpdateDefinitionCurrentDateType? |
O exemplo de código a seguir usa o método CurrentDate()
para atualizar o campo Date
do primeiro objeto GradeEntry
para a data atual em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .CurrentDate(restaurant => restaurant.Grades[0].Date); var result = _restaurantsCollection.UpdateMany(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .CurrentDate(restaurant => restaurant.Grades[0].Date); var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
Redefinir um campo
Para remover um campo de um documento, chame o método Builders.Update.Unset()
. Este método aceita o seguinte parâmetro:
Parâmetro | Descrição |
---|---|
| Uma expressão que especifica o campo a ser removido. Tipo de Dados: |
O exemplo de código a seguir usa o método Unset()
para remover o campo Cuisine
em todos os documentos correspondentes:
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Unset(restaurant => restaurant.Cuisine); var result = _restaurantsCollection.UpdateMany(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Shake Shack"); var update = Builders<Restaurant>.Update .Unset(restaurant => restaurant.Cuisine); var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
Documentação da API
Para obter mais informações sobre qualquer um dos métodos discutidos nesta guia, consulte a seguinte documentação da API: