Overview
在本指南中,您可以学习;了解如何使用MongoDB PHP库对MongoDB集合运行替换操作。 替换操作的执行方式与更新操作不同。 更新操作仅修改目标文档中的指定字段。 替换操作会删除目标文档中的所有字段,然后替换为新字段。
要替换文档,请使用MongoDB\Collection::replaceOne()方法。
样本数据
本指南中的示例使用Atlas示例数据集的sample_restaurants数据库中的restaurants集合。 要从PHP应用程序访问权限此集合,请实例化一个连接到Atlas 集群的MongoDB\Client ,并将以下值分配给$collection变量:
$collection = $client->sample_restaurants->restaurants;
要学习如何创建免费的MongoDB 部署并加载示例数据集,请参阅MongoDB 入门指南。
替换操作
您可以使用MongoDB\Collection::replaceOne()执行替换操作。 此方法会从匹配搜索条件的第一个文档中删除除_id字段之外的所有字段。 然后,它将您指定的字段和值插入到文档中。
所需参数
replaceOne() 方法需要使用以下参数:
查询过滤文档,用于确定要替换的文档。 有关查询筛选器的更多信息,请参阅MongoDB Server手册中的查询筛选器文档部分。
替换文档,指定要插入新文档中的字段和值。
返回值
replaceOne()方法返回一个MongoDB\UpdateResult对象。 MongoDB\UpdateResult类型包含以下方法:
方法 | 说明 |
|---|---|
| 返回与查询过滤匹配的文档数,无论有多少文档已更新。 |
| 返回更新操作修改的文档数。 如果更新后的文档与原始文档相同,则不计入此计数。 |
| 返回更新或插入到数据库中的文档数(如果有)。 |
| 如果驱动程序执行了更新或插入(upsert),则返回在数据库中更新或插入的文档的ID。 |
| 返回一个布尔值,表示服务器是否确认了写入操作。 |
例子
以下示例使用replaceOne()方法替换name字段值为'Pizza Town'的文档的字段和值。 然后打印已修改文档的数量:
$replaceDocument = [ 'name' => 'Mongo\'s Pizza', 'cuisine' => 'Pizza', 'address' => [ 'street' => '123 Pizza St', 'zipCode' => '10003', ], 'borough' => 'Manhattan', ]; $result = $collection->replaceOne(['name' => 'Pizza Town'], $replaceDocument); echo 'Modified documents: ', $result->getModifiedCount();
Modified documents: 1
重要
_id 字段的值不可变。如果您的替换文档指定 _id 字段的值,则它必须与现有文档的 _id 值匹配。
修改替换操作
您可以通过传递指定选项值的大量作为参数来修改MongoDB\Collection::replaceOne()方法的行为。 下表描述了您可以在大量中设立的一些选项:
选项 | 说明 |
|---|---|
| |
| |
| 指定在执行替换操作之前应用文档的排序顺序。 |
| |
| 获取或设置用于扫描文档的索引。 有关更多信息,请参阅 MongoDB Server 手册中的提示语句。 |
| 指定与操作关联的客户端会话。 |
| |
|
排序规则
要为操作指定排序规则,请传递 $options大量参数,该参数将 collation 选项设置为操作方法。将 collation 选项分配给配置排序规则规则的大量。
下表描述了可以设立以配置排序规则的字段:
字段 | 说明 |
|---|---|
| |
| (可选)指定是否包括大小写比较。当设立为 |
| (可选)指定三级比较期间大小写差异的排序顺序。数据类型: |
| (可选)指定要执行的比较级别,如 ICU 文档中所定义。数据类型: |
| |
| (可选)指定库是否将空格和标点符号视为基本字符以进行比较。数据类型: |
| (可选)指定当 |
| (可选)指定包含变音符号的字符串是否从后往前排序。数据类型: |
要学习;了解有关排序规则和每个字段可能值的更多信息,请参阅MongoDB Server手册中的排序规则条目。
例子
以下代码使用replaceOne()方法查找name字段值为'Food Town'的第一个文档,然后将该文档替换为name值为'Food World'的新文档。 由于upsert选项设立为true ,因此如果查询过滤与任何现有文档都不匹配,则库将插入一个新文档:
$replaceDocument = [ 'name' => 'Food World', 'cuisine' => 'Mixed', 'address' => [ 'street' => '123 Food St', 'zipCode' => '10003', ], 'borough' => 'Manhattan', ]; $result = $collection->replaceOne( ['name' => 'Food Town'], $replaceDocument, ['upsert' => true], );
更多信息
要学习;了解有关更新操作的更多信息,请参阅更新文档指南。
要了解创建查询筛选器的更多信息,请参阅指定查询指南。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: