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

Come generare documenti Mongodb in modo ricorsivo utilizzando il driver mongocxx c++?

È difficile essere sicuri senza vedere il contesto del segmento che hai pubblicato, ma sembra che il problema che stai riscontrando riguardi il tipo di output di << operatore sul generatore di flussi. Il generatore di flussi in realtà ha un nome errato; non è un "flusso" nel tipico senso C++ della parola, come tipo di output di << l'operatore a volte sarà diverso dall'operando di sinistra. In particolare, ogni volta che usi qualcosa come open_document o close_document , il tipo che l'espressione restituisce sarà diverso da quello che è l'operando sul lato sinistro. Per questo motivo, generalmente dovrai memorizzare l'output di una di queste espressioni.

A causa della confusione che spesso causa lo stream builder in casi come questo, è generalmente preferibile utilizzare invece il basic builder. Sebbene la sintassi del builder di base sia un po' più dettagliata, è molto più difficile commettere un sottile errore e quando si commette un errore, i messaggi di errore del compilatore sono molto più facili da capire.

Ecco come creare lo stesso documento con il builder di base:

#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 prende un numero arbitrario di kvp 's (coppie chiave-valore) e le aggiunge al builder. Per i tipi di base come le stringhe, puoi semplicemente passare il valore come secondo argomento. Per creare un documento secondario, usa un lambda come secondo argomento che accetta un bsoncxx::builder::basic::sub_document e quindi aggiungi a quel generatore di documenti secondari allo stesso modo.

Per estrarre il documento dal builder, puoi utilizzare il view() o extract() metodi. view() restituisce un bsoncxx::document::view() , che è una vista non di proprietà del documento; il costruttore deve rimanere in vita per tutto il tempo in cui viene utilizzata la vista. extract() restituisce un bsoncxx::document::value, che è un valore di proprietà; quando extract() viene chiamato, il builder viene riportato allo stato vuoto.