Как генерировать документы 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
После этого мне нужно было запихнуть его в mongodb.
Вызов метода подключения из формы метода препарирования main.cpp
Вызовите соединение mongodb после разбора шестнадцатеричной строки
Создайте mongodbConnection:
Вызов MongodbMapper для отображения сгенерированного кода в БД
Вызовите GenerateDocument, чтобы сгенерировать его автоматически
Connect -> Mapp -> Generate -> Insert
И здесь я получил стопку, получил ошибку при попытке его скомпилировать.
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) {
Трудно быть уверенным, не видя контекст сегмента, который вы разместили, но похоже, что проблема, с которой вы сталкиваетесь, связана с типом вывода <<
оператор по созданию потоков. Построитель потока фактически неверно назван; это не «поток» в типичном для С ++ смысле этого слова, как тип вывода <<
Оператор когда-нибудь будет отличаться от левого операнда. В частности, когда вы используете что-то вроде 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
s (пары ключ-значение) и добавляет их в конструктор. Для базовых типов, таких как строки, вы можете просто передать значение в качестве второго аргумента. Чтобы создать поддокумент, используйте лямбду в качестве второго аргумента, который принимает bsoncxx::builder::basic::sub_document
и затем добавьте к тому же конструктору вложенных документов таким же образом.
Чтобы получить документ от застройщика, вы можете использовать view()
или же extract()
методы. view()
возвращает bsoncxx::document::view()
, который является непризнанным представлением документа; строитель должен оставаться живым в течение всего времени использования вида. extract()
возвращает bsoncxx :: document :: value, который является собственностью; когда extract()
вызывается, строитель возвращается в пустое состояние.
Других решений пока нет …