【问题标题】:How to generate Mongodb documents recursively using mongocxx c++ driver?如何使用 mongocxx c++ 驱动递归生成 Mongodb 文档?
【发布时间】:2017-03-22 13:14:59
【问题描述】:

如何使用mongocxx c++驱动递归生成Mongodb文档? 1.我使用mongocxx c++驱动v.3和c++11。 2. 这是我的 main.cpp 方法,它解析十六进制字符串并生成这样的 mongocxx 代码: 控制台:$ ./main dissect 0x160301012c01000128030340c70e243001b96d8c 和输出:

    << "MainType" << bsoncxx::builder::stream::open_document
    << "TLSRecord" << bsoncxx::builder::stream::open_document
        << "type"<< "16"
        << "version"<< "0301"
        << "length"<< "012C"
        << "hsMsg" << bsoncxx::builder::stream::open_document
            << "type"<< "01"
            << "length"<< "000128"
            << "clientHello" << bsoncxx::builder::stream::open_document
                << "version"<< "0303"
                << "random"<< "40C70E243001B96D8C"
                << "session_id_length"<< ""
            << bsoncxx::builder::stream::close_document
        << bsoncxx::builder::stream::close_document
    << bsoncxx::builder::stream::close_document
  1. 之后我需要将它推送到 mongodb 中。

  2. 我在这里堆积,尝试编译时出错。

    src/MongodbMapper.cpp:76:6: note: candidate function not viable: no known conversion from'bsoncxx::v_noabi::builder::stream::key_context&lt;bsoncxx::v_noabi::builder::stream::key_context&lt;bsoncxx::v_noabi::builder::stream::closed_context&gt; &gt;' to 'bsoncxx::builder::stream::document &' for 3rd argument void generateDocument(DataUnit& node, int level, bsoncxx::builder::stream::document& doc) {

【问题讨论】:

    标签: c++ mongodb c++11 mongo-cxx-driver mongo-collection


    【解决方案1】:

    如果不查看您发布的片段的上下文,很难确定,但您遇到的问题似乎是流构建器上&lt;&lt; 运算符的输出类型。流构建器实际上命名错误;它不是典型的 C++ 意义上的“流”,因为 &lt;&lt; 运算符的输出类型有时会与左侧操作数不同。特别是,每当您使用 open_documentclose_document 之类的东西时,表达式输出的类型将不同于左侧操作数的类型。因此,您通常需要存储其中一个表达式的输出。

    由于流构建器在这种情况下经常引起混淆,因此通常最好使用基本构建器。虽然基本构建器的语法有点冗长,但很难用它犯一个微妙的错误,而且当你确实犯了错误时,编译器错误消息更容易理解。

    以下是使用基本构建器构建相同文档的方法:

    #include <bsoncxx/builder/basic/document.hpp>
    #include <bsoncxx/builder/basic/kvp.hpp>
    #include <bsoncxx/builder/basic/sub_document.hpp>
    
    using bsoncxx::builder::basic::kvp;
    using bsoncxx::builder::basic::sub_document;
    
    bsoncxx::builder::basic::document doc;
    
    // Build the document
    doc.append(kvp("MainType", [](sub_document sub_doc1) {
        sub_doc1.append(kvp("TLSRecord", [](sub_document sub_doc2) {
            sub_doc2.append(kvp("type", "16"),
                            kvp("version", "0301"),
                            kvp("length", "012C"),
                            kvp("hsMsg", [](sub_document sub_doc3) {
                                sub_doc3.append(kvp("type", "01"),
                                                kvp("length", "000128"),
                                                kvp("clientHello", [](sub_document sub_doc4) {
                                                    sub_doc4.append(
                                                        kvp("version", "0303"),
                                                        kvp("random", "40C70E243001B96D8C"),
                                                        kvp("session_id_length", ""));
                                                }));
                            }));
        }));
    }));
    
    // Get a view of the document being built and do something with it.
    do_something_with_document_view(doc.view());
    
    // Extract the document from the builder and do something with it.
    do_something_with_owned_document(doc.extract());
    

    bsoncxx::builder::basic::document::append 接受任意数量的kvp(键值对)并将它们附加到构建器。对于字符串等基本类型,您可以将值作为第二个参数传递。要构建子文档,请使用 lambda 作为接受 bsoncxx::builder::basic::sub_document 的第二个参数,然后以相同的方式附加到该子文档构建器。

    要从构建器中取出文档,您可以使用view()extract() 方法。 view() 返回一个bsoncxx::document::view(),这是文档的无主视图;构建器需要在使用视图的整个过程中保持活动状态。 extract() 返回一个 bsoncxx::document::value,它是一个拥有的值;当extract() 被调用时,构建器被重置为空状态。

    【讨论】:

    • 谢谢,很有用。坦白说,mongocxx 驱动的 C++ API 是我见过的最差的。
    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 2018-06-12
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多