指定查询
概述
在本指南中,您可以通过使用 C++ 驱动程序来指定查询。
您可以通过创建一个查询过滤器来细化查询返回的文档集合。查询过滤器是一个表达式,它指定MongoDB在读取或写入操作中用于匹配文档的搜索条件。在查询过滤器中,您可以提示驱动程序搜索与您的查询完全匹配的文档,或者您可以组合查询过滤器来表达更复杂的匹配条件。
示例数据
本指南中的示例在名为fruits
的集合上运行操作,该集合包含表示水果的文档。以下代码示例展示了如何创建数据库和集合,然后将示例文档插入到您的集合中
mongocxx::uri uri("<connection string>"); mongocxx::client client(uri); auto db = client["db"]; auto collection = db["fruits"]; std::vector<bsoncxx::document::value> fruits; fruits.push_back(make_document(kvp("_id", 1), kvp("name", "apples"), kvp("qty", 5), kvp("rating", 3), kvp("color", "red"), kvp("type", make_array("fuji", "honeycrisp")))); fruits.push_back(make_document(kvp("_id", 2), kvp("name", "bananas"), kvp("qty", 7), kvp("rating", 4), kvp("color", "yellow"), kvp("type", make_array("cavendish")))); fruits.push_back(make_document(kvp("_id", 3), kvp("name", "oranges"), kvp("qty", 6), kvp("rating", 2), kvp("type", make_array("naval", "mandarin")))); fruits.push_back(make_document(kvp("_id", 4), kvp("name", "pineapples"), kvp("qty", 3), kvp("rating", 5), kvp("color", "yellow"))); auto result = collection.insert_many(fruits);
精确匹配
文本值查询返回与您的查询过滤器完全匹配的文档。
以下示例将查询过滤器指定为find()
方法的参数。该代码返回所有color
字段的值为"yellow"
的文档
auto cursor = collection.find(make_document(kvp("color", "yellow"))); for (auto &&doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 4, "name" : "pineapple", "qty" : 3, "rating" : 5, "color" : "yellow" }
提示
查找所有文档
要查找集合中的所有文档,请调用find()
方法并传递一个空查询过滤器。以下示例查找集合中的所有文档
auto cursor = collection.find({});
比较运算符
比较运算符通过将文档字段值与查询过滤器中指定的值进行比较来评估。以下列表定义了常见的比较运算符
$gt
:大于$lte
:小于或等于$ne
:不等于
要查看比较运算符的完整列表,请参阅比较查询运算符指南中的MongoDB服务器手册。
以下示例在查询过滤器中将比较运算符指定为find()
方法的参数。该代码返回所有具有大于2
的rating
字段值的文档
auto cursor = collection.find(make_document(kvp("rating", make_document(kvp("$gt", 2))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
逻辑运算符
逻辑运算符通过应用于两个或多个表达式集的结果的逻辑来匹配文档。以下列表描述了每个逻辑运算符
$and
:返回所有匹配所有子句条件的文档$or
:返回所有匹配一个子句条件的文档$nor
:返回所有不匹配任何子句条件的文档$not
:返回所有不匹配表达式的文档
要了解更多关于逻辑运算符的信息,请参阅MongoDB服务器手册中的逻辑查询运算符指南。
以下示例在查询过滤器中将逻辑运算符指定为find()
方法的参数。该代码返回所有qty
字段值大于5
或color
字段值为“yellow”的文档
auto cursor = collection.find( make_document(kvp("$or", make_array(make_document(kvp("qty", make_document(kvp("$gt", 5)))), make_document(kvp("color", "yellow")))))); for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 3, "name" : "oranges", "qty" : 6, "rating" : 2, "type" : [ "naval", "mandarin" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
数组运算符
数组运算符根据数组字段的值或元素数量匹配文档。以下列表描述了可用的数组运算符
$all
:返回包含查询中所有元素的数组文档$elemMatch
:返回数组字段中的元素匹配查询中所有条件的文档$size
:返回具有指定大小的数组的所有文档
要了解有关数组运算符的更多信息,请参阅MongoDB服务器手册中的数组查询运算符指南。
以下示例将数组运算符指定为查询过滤器中find()
方法的参数。该代码返回所有在type
数组字段包含2
个元素的文档
auto cursor = collection.find(make_document(kvp("type", make_document(kvp("$size", 2))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 3, "name" : "oranges", "qty" : 6, "rating" : 2, "type" : [ "naval", "mandarin" ] }
元素运算符
元素运算符根据字段的存现或类型查询数据。
要了解有关元素运算符的更多信息,请参阅MongoDB服务器手册中的元素查询运算符指南。
以下示例将元素运算符指定为查询过滤器中find()
方法的参数。该代码返回所有具有color
字段的文档
auto cursor = collection.find(make_document(kvp("color", make_document(kvp("$exists", true))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
评估运算符
评估运算符基于对单个字段或整个集合文档的评估返回数据。
以下列表描述了常见的评估运算符
$text
:在文档上执行文本搜索$regex
:返回与指定正则表达式匹配的文档$mod
:对一个字段的值执行模运算,并返回余数为指定值的文档
要查看评估运算符的完整列表,请参阅 MongoDB 服务器手册中的评估查询运算符指南。
以下示例在查询过滤器中将评估运算符指定为find()
方法的参数。该代码使用正则表达式返回所有在name
字段值中至少有两个连续"p"
字符的文档。
auto cursor = collection.find(make_document(kvp("name", make_document(kvp("$regex", "p{2,}"))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
更多信息
要了解有关查询文档的更多信息,请参阅 MongoDB 服务器手册中的查询文档指南。
要了解有关使用 C++ 驱动程序检索文档的更多信息,请参阅检索数据指南。
API 文档
要了解有关本指南中讨论的任何方法或类型的更多信息,请参阅以下 API 文档