sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo generar documentos Mongodb recursivamente usando el controlador mongocxx c ++?

Es difícil estar seguro sin ver el contexto del segmento que publicaste, pero parece que el problema con el que te encuentras es con el tipo de salida del << operador en el generador de secuencias. El generador de flujo en realidad tiene un nombre incorrecto; no es un "flujo" en el sentido típico de C++ de la palabra, como el tipo de salida del << En algún momento, el operador será diferente al operando del lado izquierdo. En particular, siempre que use algo como open_document o close_document , el tipo que genera la expresión será diferente del operando del lado izquierdo. Debido a esto, generalmente deberá almacenar la salida de una de esas expresiones.

Debido a la confusión que suele causar el generador de secuencias en casos como este, generalmente es preferible usar el generador básico en su lugar. Si bien la sintaxis del constructor básico es un poco más detallada, es mucho más difícil cometer un error sutil con ella, y cuando comete un error, los mensajes de error del compilador son mucho más fáciles de entender.

Así es como crearía el mismo documento con el generador 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 toma un número arbitrario de kvp 's (pares clave-valor) y los agrega al constructor. Para tipos básicos como cadenas, puede simplemente pasar el valor como segundo argumento. Para construir un subdocumento, use un lambda como segundo argumento que toma un bsoncxx::builder::basic::sub_document y luego agregar a ese generador de subdocumentos de la misma manera.

Para sacar el documento del constructor, puede usar view() o extract() métodos. view() devuelve un bsoncxx::document::view() , que es una vista sin propietario del documento; el constructor debe permanecer activo durante todo el tiempo que se utilice la vista. extract() devuelve un bsoncxx::document::value, que es un valor propio; cuando extract() se llama, el constructor se restablece al estado vacío.