c++ - 将包含数组的 BSON 文档转换为 JSON,从转换后的 JSON (C++) 中删除数组

标签 c++ mongodb mongo-cxx-driver

我有一个看起来像这样的文档:

{
    "_id" : ObjectId("5bd37e0128f41363c0006ac2"),
    "source" : "Forge",
    "data" : [ 
        {
            "symbol" : "EURUSD",
            "bid" : 1.14021,
            "ask" : 1.14024,
            "price" : 1.14023,
            "timestamp" : 1540587008
        }
    ]
}

我想从 bson 文档中获取数据部分,这是我通过以下代码完成的:

auto dataDocument = view["data"].get_value().get_document();
auto textMessage = bsoncxx::to_json(dataDocument);

然而,当字段数据是示例中的数组时,输出是这样的:

{
    "0": {
        "symbol": "EURUSD",
        "bid": 1.1405199999999999783,
        "ask": 1.1405300000000000438,
        "price": 1.1405300000000000438,
        "timestamp": 1540580136
    }
}

而不是这个(正确):

[{
        "symbol": "EURUSD",
        "bid": 1.14056,
        "ask": 1.14057,
        "price": 1.14057,
        "timestamp": 1540580927
    }
]

为什么括号被移除,取而代之的是“0”字段?

如果我在整个文档上执行 to_json,则数组会保留,只有当我在作为数组的字段数据上执行 to_json 时,才会发生错误。

有什么想法吗?

更新,这是一个重现我的问题的工作示例:

#include <mongocxx/instance.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>

int main()
{
    mongocxx::instance inst{};
    auto conn = mongocxx::client{ mongocxx::uri{} };
    auto collection = conn["QuantBot"]["test"];

    auto jsonDoc = R"(    
    {
        "source" : "Forge",
        "data" : [ 
            {
                "symbol" : "EURUSD",
                "bid" : 1.13875,
                "ask" : 1.13925,
                "price" : 1.139,
                "timestamp" : 1540758149
            }
        ]
    }
    )";

    auto bsonDocument = bsoncxx::from_json(jsonDoc);
    collection.insert_one(bsonDocument.view());

    auto cursor = std::make_unique<mongocxx::cursor>(collection.find({}));
    auto cursorIt = std::make_unique<mongocxx::cursor::iterator>(cursor->begin());
    auto view = bsoncxx::document::view(**cursorIt);
    auto dataDocument = view["data"].get_value().get_document();
    auto textMessage = bsoncxx::to_json(dataDocument);
}

最佳答案

我相信问题出在这里:get_value().get_document()。尝试用 get_value().get_array() 代替。另请注意,在调用任何方法之前,您应该检查 get_value 返回值的类型。这更多的是靠运气而不是好的设计。您看到文字零的原因是因为 BSON 数组表示为具有整数键的文档。实际上,您已将数组转换为文档,因此它打印为带有数字键的文档,而不是预期的数组。

关于c++ - 将包含数组的 BSON 文档转换为 JSON,从转换后的 JSON (C++) 中删除数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53016213/

相关文章:

c++ - 文档{}的mongodb C++驱动程序编译错误

c++ - Mongo C++ 批量操作

c++ - MongoDB C++ 驱动程序

C++错误从文件中读取值

c++ - 我如何重载 new/STL 以使未知对象更快?

c++ - 相同模板类但不同模板类型的 protected 成员

java - 如何使用 Java Webapp 将文件上传到 MongoDB?

mongodb - 如何在Mongodb中将枚举存储为字符串而不是int

c++ - 删除名称为使用字符串变量创建的文件

python - 仅初始化 mongo 副本集一次