sql >> Databáze >  >> NoSQL >> MongoDB

Jak generovat dokumenty Mongodb rekurzivně pomocí ovladače mongocxx c++?

Je těžké si být jisti, aniž byste viděli kontext segmentu, který jste zveřejnili, ale zdá se, že problém, na který narazíte, je s typem výstupu << operátor na staviteli streamu. Tvůrce proudu je ve skutečnosti nesprávně pojmenován; není to "stream" v typickém smyslu slova C++, jako výstupní typ << operátor bude někdy jiný než levý operand. Zejména vždy, když použijete něco jako open_document nebo close_document , typ výstupu výrazu bude jiný, než jaký je levý operand. Z tohoto důvodu budete obecně muset uložit výstup jednoho z těchto výrazů.

Kvůli zmatkům, které v případech, jako je tento, často způsobuje tvůrce streamů, je obecně vhodnější místo toho použít základní tvůrce. I když je syntaxe základního stavitele trochu podrobnější, je mnohem těžší v ní udělat drobnou chybu, a když uděláte chybu, chybové zprávy kompilátoru jsou mnohem srozumitelnější.

Zde je návod, jak byste vytvořili stejný dokument se základním tvůrcem:

#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 bere libovolný počet kvp 's (páry klíč–hodnota) a připojí je k staviteli. U základních typů, jako jsou řetězce, můžete hodnotu pouze předat jako druhý argument. Chcete-li vytvořit vnořený dokument, použijte lambda jako druhý argument, který přebírá bsoncxx::builder::basic::sub_document a poté stejným způsobem připojte k tomuto tvůrci vnořených dokumentů.

Chcete-li získat dokument z tvůrce, můžete použít view() nebo extract() metody. view() vrátí bsoncxx::document::view() , což je nevlastněné zobrazení dokumentu; stavitel musí zůstat naživu po celou dobu použití pohledu. extract() vrátí bsoncxx::document::value, což je vlastněná hodnota; když extract() je zavolán, stavitel je resetován zpět do prázdného stavu.




  1. Mongodb počítá všechny prvky pole ve všech objektech odpovídajících kritériím

  2. 5 způsobů, jak získat minuty z rande v MongoDB

  3. Co znamená kód *((char*)-1) ='x'?

  4. Kubernetes / Rancher 2, mongo-replicaset s nasazením Local Storage Volume