MongoDB 使用数组中的 OR 条件构建查询
MongoDB building query with OR condition from an array
我想使用 MongoDB C++ api 创建并 运行 具有以下条件的查询:
- 时间戳在一个范围内AND
- 从一组字符串中,至少有一个等于类型
我的 MongoDB 文档中有这些字段:
id_、时间戳、类型
我已经使用构建器流来创建我的查询。对于过滤时间戳的第一个条件,我做了:
Document doc_timestamp;
doc_timestamp << "timestamp" << open_document <<
"$gt" << startTS <<
"$lte" << endTS
<< close_document
如果我 运行 单独第一个条件,它 运行 是完美的。但我不确定如何为 type 字段执行此操作。我喜欢这样:
Document doc_type;
auto arr_type = doc_type <<
"$or" << open_array;
for (auto nNum : nTypes) {
arr_type = arr_type << "type" << std::to_string(nNum);
}
arr_type << close_array;
这个过滤器不起作用。它会引发 运行 时间错误。我在这里做错了什么?另外,我如何连接这两个过滤器并将其 find 函数传递给 运行 查询。
提前致谢!
不确定 $or
是否是数组过滤器的最佳选择。如果您想查找某个元素是否存在于数组中,您可以使用 $in
operator
已经有 some discussions about building a bson array in a loop 像您尝试的那样,但即使是 @acm 也建议使用 bsoncxx::builder::basic
而不是 bsoncxx::builder::stream
。
使用 bsoncxx::builder::basic::array{}
,您可以将所有类型附加到数组,并通过 $in
运算符直接在查询中使用它。
关于如何连接两个过滤器,一个接一个添加即可:
using namespace bsoncxx::builder::stream;
// Some random start/end time and types
std::chrono::system_clock::time_point from_time = std::chrono::system_clock::now() - std::chrono::hours(5);
std::chrono::system_clock::time_point to_time = std::chrono::system_clock::now() + std::chrono::hours(5);
const auto types = { "xls", "docx", "pdf" };
auto array_builder = bsoncxx::builder::basic::array{};
for (const auto& type : types ) { array_builder.append(type); }
mongocxx::cursor cursor = db["query"].find(
document{} <<
"timestamp" << open_document <<
"$gt" << bsoncxx::types::b_date{ from_time } <<
"$lt" << bsoncxx::types::b_date{ to_time } <<
close_document <<
"type" << open_document <<
"$in" << array_builder <<
close_document <<
finalize
);
for (auto doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}
我想使用 MongoDB C++ api 创建并 运行 具有以下条件的查询:
- 时间戳在一个范围内AND
- 从一组字符串中,至少有一个等于类型
我的 MongoDB 文档中有这些字段: id_、时间戳、类型
我已经使用构建器流来创建我的查询。对于过滤时间戳的第一个条件,我做了:
Document doc_timestamp;
doc_timestamp << "timestamp" << open_document <<
"$gt" << startTS <<
"$lte" << endTS
<< close_document
如果我 运行 单独第一个条件,它 运行 是完美的。但我不确定如何为 type 字段执行此操作。我喜欢这样:
Document doc_type;
auto arr_type = doc_type <<
"$or" << open_array;
for (auto nNum : nTypes) {
arr_type = arr_type << "type" << std::to_string(nNum);
}
arr_type << close_array;
这个过滤器不起作用。它会引发 运行 时间错误。我在这里做错了什么?另外,我如何连接这两个过滤器并将其 find 函数传递给 运行 查询。
提前致谢!
不确定 $or
是否是数组过滤器的最佳选择。如果您想查找某个元素是否存在于数组中,您可以使用 $in
operator
已经有 some discussions about building a bson array in a loop 像您尝试的那样,但即使是 @acm 也建议使用 bsoncxx::builder::basic
而不是 bsoncxx::builder::stream
。
使用 bsoncxx::builder::basic::array{}
,您可以将所有类型附加到数组,并通过 $in
运算符直接在查询中使用它。
关于如何连接两个过滤器,一个接一个添加即可:
using namespace bsoncxx::builder::stream;
// Some random start/end time and types
std::chrono::system_clock::time_point from_time = std::chrono::system_clock::now() - std::chrono::hours(5);
std::chrono::system_clock::time_point to_time = std::chrono::system_clock::now() + std::chrono::hours(5);
const auto types = { "xls", "docx", "pdf" };
auto array_builder = bsoncxx::builder::basic::array{};
for (const auto& type : types ) { array_builder.append(type); }
mongocxx::cursor cursor = db["query"].find(
document{} <<
"timestamp" << open_document <<
"$gt" << bsoncxx::types::b_date{ from_time } <<
"$lt" << bsoncxx::types::b_date{ to_time } <<
close_document <<
"type" << open_document <<
"$in" << array_builder <<
close_document <<
finalize
);
for (auto doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}