MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como gerar documentos Mongodb recursivamente usando o driver mongocxx c++?


É difícil ter certeza sem ver o contexto do segmento que você postou, mas parece que o problema que você está enfrentando é com o tipo de saída do << operador no construtor de fluxo. O construtor de fluxo é, na verdade, nomeado incorretamente; não é um "stream" no sentido típico de C++ da palavra, pois o tipo de saída do << às vezes será diferente do operando do lado esquerdo. Em particular, sempre que você usar algo como open_document ou close_document , o tipo de saída da expressão será diferente do operando do lado esquerdo. Por causa disso, você geralmente precisará armazenar a saída de uma dessas expressões.

Devido à confusão que o construtor de fluxo geralmente causa em casos como esse, geralmente é preferível usar o construtor básico. Embora a sintaxe do construtor básico seja um pouco mais detalhada, é muito mais difícil cometer um erro sutil com ela e, quando você comete um erro, as mensagens de erro do compilador são muito mais fáceis de entender.

Veja como você construiria o mesmo documento com o construtor básico:
#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 recebe um número arbitrário de kvp 's (pares de chave-valor) e os anexa ao construtor. Para tipos básicos como strings, você pode simplesmente passar o valor como segundo argumento. Para construir um subdocumento, use um lambda como o segundo argumento que recebe um bsoncxx::builder::basic::sub_document e, em seguida, anexar a esse construtor de subdocumentos da mesma maneira.

Para obter o documento do construtor, você pode usar o view() ou extract() métodos. view() retorna um bsoncxx::document::view() , que é uma exibição sem proprietário do documento; o construtor precisa permanecer ativo durante todo o tempo em que a exibição for usada. extract() retorna um bsoncxx::document::value, que é um valor de propriedade; quando extract() é chamado, o construtor é redefinido para o estado vazio.