更新文档
概述
在本指南中,您可以学习如何使用C++驱动程序更新MongoDB集合中的文档。您可以调用update_one()
方法来更新单个文档或调用update_many()
方法来更新多个文档。
示例数据
本指南中的示例使用来自MongoDB Atlas样本数据集的sample_restaurants
数据库中的restaurants
集合。要访问您的C++应用程序中的此集合,请实例化一个连接到Atlas集群的mongocxx::client
,并将以下值分配给您的db
和collection
变量
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
要了解如何创建免费的MongoDB Atlas集群并加载样本数据集,请参阅Atlas入门指南。
更新操作
您可以使用以下方法在MongoDB中执行更新操作
update_one()
,用于更新符合搜索条件的第一个文档update_many()
,用于更新所有符合搜索条件的文档
每个更新方法都需要以下参数
查询过滤器文档:指定要更新的文档。有关查询过滤器的更多信息,请参阅MongoDB服务器手册中的查询过滤器文档部分。
更新文档:指定更新操作符或要执行更新的类型以及要更改的字段和值。有关更新操作符及其用法的列表,请参阅MongoDB服务器手册中的字段更新操作符指南。
更新单个文档
以下示例使用update_one()
方法将restaurants
集合中一个文档的name
值从"Bagels N Buns"
更新为"2 Bagels 2 Buns"
。
auto query_filter = make_document(kvp("name", "Bagels N Buns")); auto update_doc = make_document(kvp("$set", make_document(kvp("name", "2 Bagels 2 Buns")))); auto result = collection.update_one(query_filter.view(), update_doc.view());
更新多个文档
以下示例使用 update_many()
方法更新所有具有 cuisine
值为 "Pizza"
的文档。更新后,文档的 cuisine
值为 "Pasta"
。
auto query_filter = make_document(kvp("cuisine", "Pizza")); auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Pasta")))); auto result = collection.update_many(query_filter.view(), update_doc.view());
自定义更新操作
您可以通过传递 mongocxx::options::update
类的实例作为可选参数来修改 update_one()
和 update_many()
方法的行为。以下表格描述了您可以在 mongocxx::options::update
实例中设置的字段
字段 | 描述 |
---|---|
| 指定在查询过滤器不匹配任何文档时,更新操作是否执行 upsert 操作。有关更多信息,请参阅 MongoDB 服务器手册中的 upsert 语句。 默认为 false 。 |
| 指定是否绕过文档验证。这允许您更新不符合模式验证要求的文档(如果存在)。有关模式验证的更多信息,请参阅 MongoDB 服务器手册中的 模式验证。 默认为 false 。 |
| 指定在排序结果时使用的语言排序规则。有关更多信息,请参阅 MongoDB 服务器手册中的 排序规则。 |
| 指定在操作修改数组字段时,更新应用于哪些数组元素。 |
| 设置用于文档的索引扫描。有关更多信息,请参阅 MongoDB 服务器手册中的 提示语句。 |
| 设置操作的写入关注点。有关更多信息,请参阅 MongoDB 服务器手册中的 写入关注点。 |
| 指定一个包含值列表的文档,以提高操作的可读性。值必须是常数或封闭表达式,不能引用文档字段。有关更多信息,请参阅MongoDB服务器手册中的 let语句。 |
| 附加到操作的注释。有关更多信息,请参阅MongoDB服务器手册中的 插入命令字段指南。 |
以下示例使用update_many()
方法查找所有具有borough
值为"Manhattan"
的文档。然后,它将这些文档中的borough
值更新为"Manhattan (north)"
。由于upsert
选项设置为true
,如果查询过滤器不匹配任何现有文档,C++驱动程序将插入一个新文档。
mongocxx::options::update opts{}; opts.upsert(true); auto query_filter = make_document(kvp("borough", "Manhattan")); auto update_doc = make_document(kvp("$set", make_document(kvp("borough", "Manhattan (north)")))); auto result = collection.update_many(query_filter.view(), update_doc.view(), opts);
返回值
update_one()
和update_many()
方法返回一个mongocxx::result::update
类的实例。该类包含以下成员函数
函数 | 描述 |
---|---|
| 返回与查询过滤器匹配的文档数量,无论更新了多少个。 |
| 返回更新操作修改的文档数量。如果更新的文档与原始文档相同,则不包括在此计数中。 |
| 返回操作的原生结果文档。 |
| 返回被插入到数据库中的文档数量。 |
| 返回在数据库中插入的文档的ID,如果驱动程序执行了插入操作。 |
以下示例使用update_many()
方法将匹配文档的name
字段从"Dunkin' Donuts"
更新为"Dunkin'"
。它调用modified_count()
成员函数以打印修改的文档数量
auto query_filter = make_document(kvp("name", "Dunkin' Donuts")); auto update_doc = make_document(kvp("$set", make_document(kvp("name", "Dunkin'")))); auto result = collection.update_many(query_filter.view(), update_doc.view()); std::cout << "Modified documents: " << result->modified_count() << std::endl;
Modified documents: 206
附加信息
要了解如何创建查询过滤器,请参阅指定查询指南。
API 文档
要了解更多关于本指南中讨论的任何方法和类型,请参阅以下API文档