更新多个文档中的字段
Overview
在此页面上,您可以学习;了解如何使用MongoDB .NET/ C#驱动程序更新多个MongoDB文档中的字段。 本页介绍如何创建 UpdateDefinition<TDocument>
对象来指定要对字段执行的更新操作。 您可以将这些对象传递给 更新多个页面中描述的更新方法。
.NET/ C#驱动程序支持 MongoDB Server手册中描述的字段更新操作符。要指定更新操作,请从 Builders.Update
属性中调用相应的方法。 以下各节将更详细地描述这些方法。
样本数据
本指南中的示例使用 sample_restaurants
数据库中的 restaurants
集合。此集合中的文档使用以下 Restaurant
、Address
和 GradeEntry
类作为模型:
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; } }
注意
restaurants
集合中的文档使用蛇形命名规则。本指南中的示例使用 ConventionPack
将集合中的字段反序列化为 Pascal 语句,并将它们映射到 Restaurant
类中的属性。
如需了解有关自定义序列化的更多信息,请参阅“自定义序列化”。
此数据集来自 Atlas 提供的示例数据集。请参阅快速入门,以了解如何创建一个免费的 MongoDB 集群并加载这些示例数据。
将值相加
要将字段的值增加特定量,请调用 Builders.Update.Inc()
方法。 此方法接受以下参数:
Parameter | 说明 |
---|---|
| 指定要递增的字段的表达式。 数据类型: |
| 字段递增的量。 数据类型: |
以下代码示例使用 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 | 说明 |
---|---|
| 指定要更新字段的表达式。 数据类型: |
| 与字段相乘的量。 数据类型: |
以下代码示例使用 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 | 说明 |
---|---|
| 指定要重命名的字段的表达式。 数据类型: |
| 字段的新名称。 数据类型: |
以下代码示例使用 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 | 说明 |
---|---|
| 指定要更新字段的表达式。 数据类型: |
| 要为字段设立的值。 数据类型: |
以下代码示例使用 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 | 说明 |
---|---|
| 指定要更新字段的表达式。 数据类型: |
| 要为字段设立的值。 数据类型: |
要将字段的值更新为指定值,但仅当指定值小于字段的当前值时,请调用 Builders.Update.Min()
方法。此方法接受以下参数:
Parameter | 说明 |
---|---|
| 指定要更新字段的表达式。 数据类型: |
| 要为字段设立的值。 数据类型: |
以下代码示例使用 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);
Set On Insert
要仅在通过同一操作更新或插入文档时设立字段的值,请调用 Builders.Update.SetOnInsert()
方法。 此方法接受以下参数:
Parameter | 说明 |
---|---|
| 指定要更新字段的表达式。 数据类型: |
| 要为字段设立的值。 数据类型: |
以下代码示例使用 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 | 说明 |
---|---|
| 指定要更新字段的表达式。 数据类型: |
| 日期和时间的格式,在 |
以下代码示例使用 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 | 说明 |
---|---|
| 一个表达式,指定要删除的字段。 数据类型: |
以下代码示例使用 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 文档
有关本指南中讨论的任何方法的更多信息,请参阅以下API文档: