sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan genererer man Mongodb-dokumenter rekursivt ved hjælp af mongocxx c++-driver?

Det er svært at være sikker uden at se konteksten af ​​det segment, du har postet, men det ser ud til, at problemet, du støder på, er med outputtypen for << operatør på strømbyggeren. Strømbyggeren er faktisk forkert navngivet; det er ikke en "stream" i ordets typiske C++ betydning, da outputtypen for << operatør vil engang være anderledes end operanden til venstre. Især når du bruger noget som open_document eller close_document , den type, som udtryk udlæser, vil være anderledes end operanden på venstre side. På grund af dette bliver du generelt nødt til at gemme output fra et af disse udtryk.

På grund af den forvirring, som vandløbsbyggeren ofte forårsager i tilfælde som dette, er det generelt at foretrække at bruge basisbyggeren i stedet. Selvom den grundlæggende builders syntaks er lidt mere udførlig, er det meget sværere at lave en subtil fejl med den, og når du laver en fejl, er compiler-fejlmeddelelserne meget nemmere at forstå.

Sådan bygger du det samme dokument op med den grundlæggende builder:

#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 tager et vilkårligt antal kvp 's (nøgleværdi-par) og tilføjer dem til builderen. For grundlæggende typer som strenge kan du bare sende værdien som det andet argument. For at opbygge et underdokument skal du bruge en lambda som det andet argument, der tager et bsoncxx::builder::basic::sub_document og føje derefter til underdokumentbyggeren på samme måde.

For at få dokumentet ud fra builderen kan du enten bruge view() eller extract() metoder. view() returnerer et bsoncxx::document::view() , som er en uejet visning af dokumentet; bygherren skal forblive i live i hele den tid udsigten bruges. extract() returnerer en bsoncxx::document::værdi, som er en ejet værdi; når extract() kaldes, nulstilles builderen tilbage til den tomme tilstand.




  1. eksportere og importere data fra mongodb ved hjælp af node.js express

  2. Problemer med at bruge MongoDB som backend til Django-projektet (Django 1.7)

  3. Deserialisering af MongoDB BSON

  4. Indirekte Ændring af Overbelastet Ejendom Laravel MongoDB