对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

更新多个文档中的字段

在此页面上,您可以学习;了解如何使用MongoDB .NET/ C#驱动程序更新多个MongoDB文档中的字段。 本页介绍如何创建 UpdateDefinition<TDocument> 对象来指定要对字段执行的更新操作。 您可以将这些对象传递给“更新多个”页面上描述的更新方法。

The .NET/C# Driver supports the field update operators described in the MongoDB Server manual. To specify an update operation, call the corresponding method from the Builders.Update property. The following sections describe these methods in more detail.

注意

方法重载

此页面上的许多方法都有多个重载。本指南中的示例仅显示每种方法的一个定义。有关可用重载的更多信息,请参阅API文档。

本指南中的示例使用 sample_restaurants 数据库中的 restaurants 集合。此集合中的文档使用以下 RestaurantAddressGradeEntry 类作为模型:

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

注意

restaurants集合中的文档使用蛇形命名规则。本指南中的示例使用 ConventionPack 将集合中的字段反序列化为 Pascal 语句,并将它们映射到 Restaurant 类中的属性。

如需了解有关自定义序列化的更多信息,请参阅“自定义序列化”。

This collection is from the sample datasets provided by Atlas. See the Get Started with the .NET/C# Driver to learn how to create a free MongoDB cluster and load this sample data.

要将字段的值增加特定量,请调用 Builders.Update.Inc() 方法。 此方法接受以下参数:

Parameter
说明

field

指定要递增的字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

value

字段递增的量。

数据类型: TField

以下代码示例使用 Inc() 方法将所有匹配文档中 Grades大量的第一个 GradeEntry对象中的 Score 值递增 2

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

要将字段的值乘以特定数量,请调用 Builders.Update.Mul() 方法。 此方法接受以下参数:

Parameter
说明

field

指定要更新字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

value

与字段相乘的量。

数据类型: TField

以下代码示例使用 Mul() 方法将 Score 值乘以所有匹配文档中 Grades大量的第一个 GradeEntry对象中的 1.25

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

要重命名字段,请调用 Builders.Update.Rename() 方法。 此方法接受以下参数:

Parameter
说明

field

指定要重命名的字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

newName

字段的新名称。

数据类型: string

以下代码示例使用 Rename() 方法将所有匹配文档中的 Address字段重命名为 location

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

注意

前面的代码示例使用字段名称 location ,因为它与MongoDB中字段名称的命名方案匹配,而不是 Restaurant 类中属性名称。

要将字段的值设立为特定值,请调用 Builders.Update.Set() 方法。 此方法接受以下参数:

Parameter
说明

field

指定要更新字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

value

要为字段设立的值。

数据类型: TField

以下代码示例使用 Set() 方法将所有匹配文档中的 recommended字段重命名为 true

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

注意

前面的代码示例使用字段名称 recommended ,因为它与MongoDB中字段名称的命名方案匹配,而不是 Restaurant 类中属性名称。

要将字段的值更新为指定值,但前提是指定值大于字段的当前值,请调用 Builders.Update.Max()方法。此方法接受以下参数:

Parameter
说明

field

指定要更新字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

value

要为字段设立的值。

数据类型: TField

要将字段的值更新为指定值,但仅当指定值小于字段的当前值时,请调用 Builders.Update.Min()方法。此方法接受以下参数:

Parameter
说明

field

指定要更新字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

value

要为字段设立的值。

数据类型: TField

以下代码示例使用 Max() 方法将第一个 GradeEntry对象的 Score字段设立为 20 和所有匹配文档中的当前值中的较大者:

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

要仅在通过同一操作更新或插入文档时设立字段的值,请调用 Builders.Update.SetOnInsert() 方法。 此方法接受以下参数:

Parameter
说明

field

指定要更新字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

value

要为字段设立的值。

数据类型: TField

以下代码示例使用 SetOnInsert() 方法将所有匹配文档中的 recommended字段设立为 true

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

注意

前面的代码示例使用字段名称 recommended ,因为它与MongoDB中字段名称的命名方案匹配,而不是 Restaurant 类中属性名称。

要学习;了解有关更新或插入文档的更多信息,请参阅 Update Many指南中的配置选项。

要将字段的值设立为当前日期和时间,请调用 Builders.Update.CurrentDate() 方法。 此方法接受以下参数:

Parameter
说明

field

指定要更新字段的表达式。

数据类型: Expression<Func<TDocument, TField>>

type

日期和时间的格式,在 UpdateDefinitionCurrentDateType枚举中定义。 默认值为 null

数据类型: UpdateDefinitionCurrentDateType?

以下代码示例使用 CurrentDate() 方法将第一个 GradeEntry对象的 Date字段更新为所有匹配文档中的当前日期:

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

要从文档中删除字段,请调用 Builders.Update.Unset() 方法。 此方法接受以下参数:

Parameter
说明

field

一个表达式,指定要删除的字段。

数据类型: Expression<Func<TDocument, TField>>

以下代码示例使用 Unset() 方法删除所有匹配文档中的 Cuisine字段:

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

有关本指南中讨论的任何方法的更多信息,请参阅以下API文档: