Docs 菜单
Docs 主页
/ / /
C#/ .NET驱动程序
/ / / /

更新多个文档中的字段

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

.NET/ C#驱动程序支持 MongoDB Server手册中描述的字段更新操作符。要指定更新操作,请从 Builders.Update属性中调用相应的方法。 以下各节将更详细地描述这些方法。

注意

方法重载

本指南中的示例使用 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 类中的属性。

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

此数据集来自 Atlas 提供的示例数据集。请参阅快速入门,以了解如何创建一个免费的 MongoDB 集群并加载这些示例数据。

要将字段的值增加特定量,请调用 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文档:

后退

UpdateMany

在此页面上