首页 > 解决方案 > 如何将 bsoncxx::document::element 写入控制台

问题描述

当给定一系列键时,我有以下函数从文档中获取值:BSON

bsoncxx::document::element deepFieldAccess(bsoncxx::document::view bsonObj, const std::vector<std::string>& path) {

    if (path.empty())
        return {};

    auto keysIter = path.begin();
    const auto keysEnd = path.end();

    auto currElement = bsonObj[*(keysIter++)];
    while (currElement && (keysIter != keysEnd))
        currElement = currElement[*(keysIter++)];

    return currElement;
}

返回bsoncxx::document::element的值可以包含任何类型的值(int32documentarrayutf8等)。如何通过 将此元素写入控制台std::cout

理想情况下,我只需要这样做:

bsoncxx::document::element myElement = deepFieldAccess(bsonObjView, currQuery);
std::cout << myElement << std::endl;

标签: c++mongodbbsonmongo-cxx-driver

解决方案


我们不能打印bsoncxx::document::element,但我们可以打印bsoncxx::document::view。所以只需将一个转换为另一个并清理生成的字符串。它丑陋且效率低下,但适用于快速查找 a 的值bsoncxx::document::element

std::string turnQueryResultIntoString(bsoncxx::document::element queryResult) {

    // check if no result for this query was found
    if (!queryResult) {
        return "[NO QUERY RESULT]";
    }

    // hax
    bsoncxx::builder::basic::document basic_builder{};
    basic_builder.append(bsoncxx::builder::basic::kvp("Your Query Result is the following value ", queryResult.get_value()));

    // clean up resulting string
    std::string rawResult = bsoncxx::to_json(basic_builder.view());
    std::string frontPartRemoved = rawResult.substr(rawResult.find(":") + 2);
    std::string backPartRemoved = frontPartRemoved.substr(0, frontPartRemoved.size() - 2);

    return backPartRemoved;
}

推荐阅读