如何使用mongocxx c ++驱动程序递归生成Mongodb文档?

时间:2017-03-22 13:14:59

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

如何使用mongocxx c ++驱动程序递归生成Mongodb文档?  1.我使用mongocxx c ++驱动程序v.3和c ++ 11。  2.这是我的main.cpp方法,它解析十六进制字符串并生成mongocxx代码,如下所示: 控制台:$ ./main解析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<bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context> >' to 'bsoncxx::builder::stream::document &' for 3rd argument void generateDocument(DataUnit& node, int level, bsoncxx::builder::stream::document& doc) {

1 个答案:

答案 0 :(得分:2)

如果没有看到您发布的细分受众群的上下文,很难确定,但看起来您遇到的问题是<<运算符的输出类型流建设者。流构建器实际上是错误的名称;它不是&#34;流&#34;在典型的C ++意义上,<<运算符的输出类型有时会与左侧操作数不同。特别是,每当您使用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()时,构建器将重置为空状态。