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

How to generate Mongodb documents recursively using mongocxx c++ driver?

本文关键字:Mongodb 文档 递归 驱动程序 何使用 mongocxx      更新时间:2023-10-16

如何使用mongocxx c ++驱动程序递归生成Mongodb文档? 1. 我使用 mongocxx c++ 驱动程序 v.3 和 c++11。 2.这是我的主要.cpp方法,它解析十六进制字符串并生成mongocxx代码,如下所示:控制台:$./主要剖析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。

    • 从 main 的剖析方法调用连接方法.cpp 在十六进制字符串解析后调用 mongodb 连接

    • 创建 mongodbConnection:

    • 调用MongodbMapper将生成的代码映射到db

    • 调用生成文档以自动生成它 连接 -> Mapp -> 生成 -> 插入

  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) {

如果不看到您发布的细分的上下文,很难确定,但看起来您遇到的问题是流构建器上<<运算符的输出类型。流构建器实际上被错误命名;它不是典型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::d ocument::value,这是一个拥有的值;调用extract()时,生成器将重置回空状态。