MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да генерирам Mongodb документи рекурсивно с помощта на mongocxx c++ драйвер?

Трудно е да сте сигурни, без да видите контекста на сегмента, който сте публикували, но изглежда, че проблемът, с който се сблъсквате, е с изходния тип на << оператор на конструктора на поток. Създателят на поток всъщност е погрешно именуван; това не е "поток" в типичния 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 (двойки ключ-стойност) и ги добавя към създателя. За основни типове като низове, можете просто да подадете стойността като втори аргумент. За да създадете поддокумент, използвайте ламбда като втори аргумент, който приема bsoncxx::builder::basic::sub_document и след това добавете към този конструктор на поддокумент по същия начин.

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да игнорирате нулеви стойности, докато демарширате документ на MongoDB?

  2. Изпълнение на JavaScript файл в MongoDB

  3. MongoDB и се присъединява

  4. Няма наличен косвен изглед

  5. Нов C++ Mongo драйвер:как да видите типа и как да получите стойност на низ