sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur genererar man Mongodb-dokument rekursivt med mongocxx c++-drivrutinen?

Det är svårt att vara säker utan att se sammanhanget för segmentet du postade, men det verkar som att problemet du stöter på är med utdatatypen för << operatör på strömbyggaren. Bäckbyggaren är faktiskt felaktigt namngiven; det är inte en "ström" i ordets typiska C++-bemärkelse, eftersom utdatatypen för << Operatören kommer någon gång att vara annorlunda än den vänstra operanden. I synnerhet när du använder något som open_document eller close_document , typen som uttrycket matar ut kommer att vara annorlunda än vad den vänstra operanden är. På grund av detta behöver du i allmänhet lagra utdata från ett av dessa uttryck.

På grund av den förvirring som strömbyggaren ofta orsakar i sådana här fall, är det i allmänhet att föredra att använda grundbyggaren istället. Även om den grundläggande byggarens syntax är lite mer utförlig, är det mycket svårare att göra ett subtilt misstag med den, och när du gör ett misstag är kompilatorns felmeddelanden mycket lättare att förstå.

Så här bygger du upp samma dokument med grundbyggaren:

#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 tar ett godtyckligt antal kvp s (nyckel-värdepar) och lägger till dem till byggaren. För grundläggande typer som strängar kan du bara skicka värdet som det andra argumentet. För att bygga upp ett underdokument, använd en lambda som det andra argumentet som tar ett bsoncxx::builder::basic::sub_document och lägg sedan till underdokumentbyggaren på samma sätt.

För att få ut dokumentet från byggaren kan du antingen använda view() eller extract() metoder. view() returnerar ett bsoncxx::document::view() , som är en oägd bild av dokumentet; byggherren behöver förbli vid liv under hela tiden som utsikten används. extract() returnerar ett bsoncxx::document::värde, som är ett ägt värde; när extract() anropas, återställs byggaren till tomt tillstånd.




  1. Vad är ett rent sätt att stoppa mongod på Mac OS X?

  2. Kräver Redis Cache i .NET Core 3 användning av Stack Exchange-paketet?

  3. Det går inte att installera mongo-php-drivrutinen på OS X 10.11

  4. Hur kan jag bygga en $or-fråga för MongoDB med Java-drivrutinen?