文档菜单
文档首页
/ / /
C++ 驱动程序
/

更新文档

本页内容

  • 概述
  • 示例数据
  • 更新操作
  • 更新单个文档
  • 更新多个文档
  • 自定义更新操作
  • 返回值
  • 附加信息
  • API文档

在本指南中,您可以学习如何使用C++驱动程序更新MongoDB集合中的文档。您可以调用update_one()方法来更新单个文档或调用update_many()方法来更新多个文档。

本指南中的示例使用来自MongoDB Atlas样本数据集的sample_restaurants数据库中的restaurants集合。要访问您的C++应用程序中的此集合,请实例化一个连接到Atlas集群的mongocxx::client,并将以下值分配给您的dbcollection变量

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

指定在查询过滤器不匹配任何文档时,更新操作是否执行 upsert 操作。有关更多信息,请参阅 MongoDB 服务器手册中的 upsert 语句
默认为 false

bypass_document_validation

指定是否绕过文档验证。这允许您更新不符合模式验证要求的文档(如果存在)。有关模式验证的更多信息,请参阅 MongoDB 服务器手册中的 模式验证
默认为 false

collation

指定在排序结果时使用的语言排序规则。有关更多信息,请参阅 MongoDB 服务器手册中的 排序规则

array_filters

指定在操作修改数组字段时,更新应用于哪些数组元素。

hint

设置用于文档的索引扫描。有关更多信息,请参阅 MongoDB 服务器手册中的 提示语句

write_concern

设置操作的写入关注点。有关更多信息,请参阅 MongoDB 服务器手册中的 写入关注点

let

指定一个包含值列表的文档,以提高操作的可读性。值必须是常数或封闭表达式,不能引用文档字段。有关更多信息,请参阅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类的实例。该类包含以下成员函数

函数
描述

matched_count()

返回与查询过滤器匹配的文档数量,无论更新了多少个。

modified_count()

返回更新操作修改的文档数量。如果更新的文档与原始文档相同,则不包括在此计数中。

result()

返回操作的原生结果文档。

upserted_count()

返回被插入到数据库中的文档数量。

upserted_id()

返回在数据库中插入的文档的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文档

返回

插入