Docs 菜单
Docs 主页
/ / /
C#/.NET
/ / /

替换文档

在此页面上

  • Overview
  • 样本数据
  • 替换一个文档
  • 自定义替换操作
  • 返回值
  • API 文档

在本指南中,您可以学习;了解如何使用.NET/ C#驱动程序替换MongoDB集合中的文档。

.NET/ C#驱动程序提供了 ReplaceOne()ReplaceOneAsync() 方法。这些方法会删除第一个符合搜索条件的文档中的所有字段(_id字段除外),然后将指定的字段和值插入到该文档中。

注意

方法重载

此页面上的许多方法都有多个重载。本指南中的示例仅显示每种方法的一个定义。有关可用重载的更多信息,请参阅 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 类中的属性。

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

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

要替换集合中的文档,请调用 ReplaceOne()ReplaceOneAsync() 方法。这些方法接受以下参数:

Parameter
说明

filter

查询过滤,用于指定要替换的文档。您可以使用Builders 类创建查询过滤。有关查询筛选器的更多信息,请参阅MongoDB Server手册。

数据类型: FilterDefinition<TDocument>

replacement

替换文档,指定要插入新文档中的字段和值。如果集合中的文档映射到C#类,则替换文档可以是该类的实例。

数据类型: TDocument

options

可选。 ReplaceOptions类的实例,用于指定替换操作的配置。默认值为null

数据类型: ReplaceOptions

cancellationToken

可选。可用于取消操作的令牌。

数据类型:CancellationToken

以下代码示例演示了如何执行替换操作。该代码执行以下步骤:

  1. 使用 Builders 类创建查询过滤。过滤匹配 cuisine字段具有值 "Pizza" 的所有文档。

  2. 创建新的 Restaurant对象。

  3. restaurants集合上调用 ReplaceOne() 方法。此操作会在集合中查找第一个匹配的文档,并将其替换为新创建的文档。

选择 SynchronousAsynchronous 标签页,查看相应的代码。

// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza"
var filter = Builders<Restaurant>.Filter
.Eq(r => r.Cuisine, "Pizza");
// Generates a new restaurant document
Restaurant newPizzaRestaurant = new()
{
Name = "Mongo's Pizza",
Cuisine = "Pizza",
Address = new Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
// Replaces the existing restaurant document with the new document
return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant);
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza"
var filter = Builders<Restaurant>.Filter
.Eq(r => r.Cuisine, "Pizza");
// Generates a new restaurant document
Restaurant newPizzaRestaurant = new()
{
Name = "Mongo's Pizza",
Cuisine = "Pizza",
Address = new Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
// Asynchronously replaces the existing restaurant document with the new document
return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant);

重要

_id 字段的值不可变。如果您的替换文档指定 _id 字段的值,则它必须与现有文档的 _id 值匹配。

ReplaceOne()ReplaceOneAsync() 方法可以选择接受 ReplaceOptions对象作为参数,该对象表示可用于配置替换操作的选项。

ReplaceOptions 类包含以下属性:

以下示例执行与前一示例相同的步骤,但也使用 BypassDocumentValidation 选项绕过任何模式验证要求。选择 SynchronousAsynchronous标签页以查看相应的代码。

// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza"
var filter = Builders<Restaurant>.Filter
.Eq(r => r.Cuisine, "Pizza");
// Generates a new restaurant document
Restaurant newPizzaRestaurant = new()
{
Name = "Mongo's Pizza",
Cuisine = "Pizza",
Address = new Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
var options = new ReplaceOptions
{
BypassDocumentValidation = true
};
// Replaces the existing restaurant document with the new document
return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant, options);
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza"
var filter = Builders<Restaurant>.Filter
.Eq(r => r.Cuisine, "Pizza");
// Generates a new restaurant document
Restaurant newPizzaRestaurant = new()
{
Name = "Mongo's Pizza",
Cuisine = "Pizza",
Address = new Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
var options = new ReplaceOptions
{
BypassDocumentValidation = true
};
// Asynchronously replaces the existing restaurant document with the new document
return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant, options);

ReplaceOne() 方法返回 ReplaceOneResult对象,ReplaceOneAsync() 方法返回 Task<ReplaceOneResult>对象。 ReplaceOneResult 类包含以下属性:

属性
说明

IsAcknowledged

指示替换操作是否由 MongoDB 确认。

数据类型: bool

IsModifiedCountAvailable

指示您是否可以读取 ReplaceOneResult 上替换记录的计数。

数据类型: bool

MatchedCount

与查询筛选器匹配的文档数量,无论是否已有文档被替换。

数据类型: long

ModifiedCount

通过替换操作替换的文档数量。

数据类型: long

UpsertedId

如果驱动程序执行了更新或插入,则在数据库中更新或插入的文档的 ID。

数据类型: BsonValue

要学习;了解有关此页面上使用的任何方法和类的更多信息,请参阅以下API文档:

后退

数组