Как генерировать документы Mongodb рекурсивно, используя драйвер mongocxx c ++?

Как генерировать документы Mongodb рекурсивно, используя драйвер mongocxx c ++?
1. Я использую драйвер mongocxx c ++ v.3 и c ++ 11.
2. Вот мой метод main.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.

  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

Решение

Трудно быть уверенным, не видя контекст сегмента, который вы разместили, но похоже, что проблема, с которой вы сталкиваетесь, связана с типом вывода << оператор по созданию потоков. Построитель потока фактически неверно назван; это не «поток» в типичном для С ++ смысле этого слова, как тип вывода << Оператор когда-нибудь будет отличаться от левого операнда. В частности, когда вы используете что-то вроде 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 занимает произвольное количество kvps (пары ключ-значение) и добавляет их в конструктор. Для базовых типов, таких как строки, вы можете просто передать значение в качестве второго аргумента. Чтобы создать поддокумент, используйте лямбду в качестве второго аргумента, который принимает bsoncxx::builder::basic::sub_document и затем добавьте к тому же конструктору вложенных документов таким же образом.

Чтобы получить документ от застройщика, вы можете использовать view() или же extract() методы. view() возвращает bsoncxx::document::view(), который является непризнанным представлением документа; строитель должен оставаться живым в течение всего времени использования вида. extract() возвращает bsoncxx :: document :: value, который является собственностью; когда extract() вызывается, строитель возвращается в пустое состояние.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]