gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:16:05 25 4
gpt4 key购买 nike

如何使用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<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_document 的内容时或 close_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() , 这是文档的无主视图;构建器需要在使用 View 的整个过程中保持事件状态。 extract()返回一个 bsoncxx::document::value,这是一个拥有的值;什么时候extract()被调用时,构建器被重置回空状态。

关于c++ - 如何使用 mongocxx c++ 驱动程序递归生成 Mongodb 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com