sql >> Database >  >> NoSQL >> MongoDB

Hoe Mongodb-documenten recursief genereren met behulp van de mongocxx c++ driver?

Het is moeilijk om zeker te zijn zonder de context te zien van het segment dat je hebt gepost, maar het lijkt erop dat het probleem dat je tegenkomt is met het uitvoertype van de << operator op de streambuilder. De streambuilder heeft eigenlijk een verkeerde naam; het is geen "stream" in de typische C++-betekenis van het woord, als het uitvoertype van de << operator zal soms anders zijn dan de linker operand. In het bijzonder, wanneer je iets als open_document . gebruikt of close_document , zal het type dat expressie uitvoert anders zijn dan wat de operand aan de linkerkant is. Daarom moet u over het algemeen de uitvoer van een van die uitdrukkingen opslaan.

Vanwege de verwarring die de streambuilder in dit soort gevallen vaak veroorzaakt, verdient het over het algemeen de voorkeur om de basisbuilder te gebruiken. Hoewel de syntaxis van de basisbouwer iets uitgebreider is, is het veel moeilijker om er een subtiele fout mee te maken, en als je een fout maakt, zijn de compilerfoutmeldingen veel gemakkelijker te begrijpen.

Zo bouwt u hetzelfde document op met de basisbouwer:

#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 neemt een willekeurig aantal kvp 's (sleutel-waarde-paren) en voegt ze toe aan de builder. Voor basistypen zoals strings, kunt u de waarde gewoon doorgeven als het tweede argument. Om een ​​subdocument op te bouwen, gebruikt u een lambda als tweede argument waaraan een bsoncxx::builder::basic::sub_document moet worden doorgegeven. en vervolgens op dezelfde manier aan die subdocumentbuilder toevoegen.

Om het document uit de builder te krijgen, kunt u de view() . gebruiken of extract() methoden. view() retourneert een bsoncxx::document::view() , wat een niet-eigendom van het document is; de bouwer moet in leven blijven gedurende de hele tijd dat de weergave wordt gebruikt. extract() geeft een bsoncxx::document::value terug, wat een eigendomswaarde is; wanneer extract() wordt aangeroepen, wordt de bouwer teruggezet naar de lege toestand.




  1. MongoDB volledige tekst zoeken

  2. Een op GUID gebaseerde Shard-sleutel programmatisch vooraf splitsen met MongoDB

  3. Zet aggregatie inclusief $cond om in DBObject in java

  4. Is er een vergelijking van NoSQL-oplossingen (wat is beter in bepaalde situaties?)