MongoDB 使用数组中的 OR 条件构建查询

MongoDB building query with OR condition from an array

我想使用 MongoDB C++ api 创建并 运行 具有以下条件的查询:

  1. 时间戳在一个范围内AND
  2. 从一组字符串中,至少有一个等于类型

我的 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;
}