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

检索数据

本页内容

  • 概述
  • 示例数据
  • 查找文档
  • 查找单个文档
  • 查找多个文档
  • 修改查找行为
  • 附加信息
  • API 文档

在本指南中,您可以学习如何使用C++驱动程序通过使用读取操作从MongoDB集合中检索数据。您可以调用find()find_one()方法从集合中检索符合一组条件的文档。

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

auto db = client["sample_training"];
auto collection = db["companies"];

要了解如何创建免费的MongoDB Atlas集群并加载示例数据集,请参阅Atlas入门指南

C++驱动程序包括两种从集合中检索文档的方法:find_one()find()。这些方法接受一个查询过滤器,并返回一个或多个匹配的文档。查询过滤器是一个对象,它指定了您要在查询中检索的文档。

提示

要了解更多关于查询过滤器的信息,请参阅指定查询.

要在集合中查找单个文档,调用 find_one() 方法并传递一个查询过滤器,该过滤器指定要查找的文档的准则。

find_one() 方法返回一个 std::optional< bsoncxx::document::value > 的实例。如果查询过滤器与文档匹配,则 optional 对象包含一个类型为 bsoncxx::document::value 的值。如果没有文档与查询过滤器匹配,则 optional 对象不包含值。

如果查询过滤器与多个文档匹配,则 find_one() 方法返回检索结果中的 第一个 匹配文档。

提示

find_one() 方法在你知道只有一个匹配的文档或你只对第一个匹配感兴趣时很有用。

以下示例使用 find_one() 方法查找第一个其 name 字段值为 "LinkedIn" 的文档。

auto result = collection.find_one(make_document(kvp("name", "LinkedIn")));
std::cout << bsoncxx::to_json(*result) << std::endl;
{ "_id" : { "$oid" : "52cdef7c4bab8bd675297e0c" }, "name" : "LinkedIn", "permalink" : "linkedin",
"crunchbase_url" : "http://www.crunchbase.com/company/linkedin", "homepage_url" : "http://linkedin.com",
...

提示

排序顺序

如果没有指定排序准则,find_one() 方法返回磁盘上的第一个文档,其顺序为 自然顺序

有关排序的更多信息,请参阅指定要返回的文档的 排序 部分。

要在集合中查找多个文档,请向 find() 方法传递一个查询过滤器,以指定您要检索的文档的准则。

以下示例使用 find() 方法查找所有 founded_year 字段值为 1970 的文档。

auto cursor = collection.find(make_document(kvp("founded_year", 1970)));

find() 方法返回一个 mongocxx::cursor 实例,您可以遍历它以查看匹配的文档。游标是一种机制,允许应用程序在给定时间仅将数据库结果的一小部分保留在内存中遍历它们。当您的 find() 方法返回大量文档时,游标非常有用。

您可以使用基于范围的 for 循环遍历游标中的文档,如下例所示。

auto cursor = collection.find(make_document(kvp("founded_year", 1970)));
for(auto&& doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}
{ "_id" : { "$oid" : "52cdef7d4bab8bd675298be4" }, "name" : "Mitsubishi Motors",
"permalink" : "mitsubishi-motors", "crunchbase_url" : "http://www.crunchbase.com/company/mitsubishi-motors",
...
{ "_id" : { "$oid" : "52cdef7e4bab8bd67529b996" }, "name" : "Western Digital",
"permalink" : "western-digital", "crunchbase_url" : "http://www.crunchbase.com/company/western-digital",
...
{ "_id" : { "$oid" : "52cdef7e4bab8bd67529b9f1" }, "name" : "Celarayn", "permalink" : "celarayn",
"crunchbase_url" : "http://www.crunchbase.com/company/celarayn",
...

注意

查找所有文档

要查找集合中的所有文档,请向 find() 方法传递一个空过滤器。

auto cursor = collection.find({})

您可以通过传递 mongocxx::options::find 类的实例作为参数来修改 find()find_one() 方法的行为。以下表格描述了您可以在 mongocxx::options::find 实例中设置的某些字段。

字段
描述

batch_size

每批返回的文档数。
类型: std::int32_t

collation

用于操作的排序规则。
类型: bsoncxx::document::view_or_value

comment

附加到操作的注释。
类型: bsoncxx::string::view_or_value

cursor_type

用于操作的游标类型。
类型: cursor::type

limit

操作可以返回的最大文档数。
类型: std::int64_t

skip

在返回结果之前要跳过的文档数。
类型: std::int64_t

sort

操作返回匹配文档的顺序。
类型: bsoncxx::document::view_or_value

以下示例使用 find() 方法查找所有 number_of_employees 字段值为 1000 的文档,并指示操作返回最多 5 个结果。

mongocxx::options::find opts;
opts.limit(5);
auto cursor = collection.find(make_document(kvp("number_of_employees", 1000)), opts);

有关mongocxx::options::find对象字段的完整列表,请参阅API文档。

要了解更多关于查询过滤器的信息,请参阅指定查询。

有关使用C++驱动程序检索文档的运行代码示例,请参阅从MongoDB读取数据。

要了解更多关于本指南中讨论的任何方法或类型的信息,请参阅以下API文档

  • find()

  • find_one()

  • limit()

返回

读取数据