MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment générer des documents Mongodb de manière récursive à l'aide du pilote mongocxx c++ ?

Il est difficile d'être sûr sans voir le contexte du segment que vous avez publié, mais il semble que le problème que vous rencontrez concerne le type de sortie du << opérateur sur le générateur de flux. Le constructeur de flux est en fait mal nommé ; ce n'est pas un "flux" au sens C++ typique du mot, car le type de sortie du << sera parfois différent de l'opérande de gauche. En particulier, chaque fois que vous utilisez quelque chose comme open_document ou close_document , le type généré par l'expression sera différent de celui de l'opérande de gauche. Pour cette raison, vous devrez généralement stocker la sortie de l'une de ces expressions.

En raison de la confusion que le constructeur de flux provoque souvent dans des cas comme celui-ci, il est généralement préférable d'utiliser le constructeur de base à la place. Bien que la syntaxe de base du constructeur soit un peu plus détaillée, il est beaucoup plus difficile de faire une erreur subtile avec, et lorsque vous faites une erreur, les messages d'erreur du compilateur sont beaucoup plus faciles à comprendre.

Voici comment créer le même document avec le générateur de 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 prend un nombre arbitraire de kvp 's (paires clé-valeur) et les ajoute au générateur. Pour les types de base comme les chaînes, vous pouvez simplement passer la valeur comme deuxième argument. Pour créer un sous-document, utilisez un lambda comme deuxième argument qui prend un bsoncxx::builder::basic::sub_document puis ajoutez à ce générateur de sous-document de la même manière.

Pour obtenir le document du générateur, vous pouvez soit utiliser le view() ou extract() méthodes. view() renvoie un bsoncxx::document::view() , qui est une vue sans propriétaire du document ; le constructeur doit rester actif pendant toute la durée d'utilisation de la vue. extract() renvoie un bsoncxx::document::value, qui est une valeur possédée ; quand extract() est appelé, le générateur est réinitialisé à l'état vide.