sql >> データベース >  >> NoSQL >> MongoDB

mongocxx c ++ドライバーを使用してMongodbドキュメントを再帰的に生成するにはどうすればよいですか?

    投稿したセグメントのコンテキストを見ずに確認するのは難しいですが、発生している問題は<<の出力タイプにあるようです。 ストリームビルダーの演算子。ストリームビルダーの名前は実際には間違っています。 <<の出力タイプとして、これは一般的なC++の意味での「ストリーム」ではありません。 演算子は、左側のオペランドとは異なる場合があります。特に、open_documentのようなものを使用するときはいつでも またはclose_document 、式が出力する型は、左側のオペランドとは異なります。このため、通常、これらの式の1つの出力を保存する必要があります。

    このような場合にストリームビルダーが頻繁に引き起こす混乱のため、代わりに基本ビルダーを使用することをお勧めします。基本的なビルダーの構文はもう少し冗長ですが、微妙な間違いを犯すのははるかに難しく、間違いを犯した場合、コンパイラーのエラーメッセージははるかに理解しやすくなります。

    基本的なビルダーを使用して同じドキュメントを作成する方法は次のとおりです。

    #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 任意の数のkvpを取ります の(キーと値のペア)を作成し、ビルダーに追加します。文字列などの基本的なタイプの場合、2番目の引数として値を渡すことができます。サブドキュメントを作成するには、bsoncxx::builder::basic::sub_documentをとる2番目の引数としてラムダを使用します 次に、同じ方法でそのサブドキュメントビルダーに追加します。

    ビルダーからドキュメントを取得するには、view()を使用できます。 またはextract() メソッド。 view() bsoncxx::document::view()を返します 、これはドキュメントの所有されていないビューです。ビューが使用されている間、ビルダーは存続している必要があります。 extract() 所有値であるbsoncxx::document::valueを返します。 extract()の場合 が呼び出されると、ビルダーは空の状態にリセットされます。




    1. mongodbの値をデクリメントします

    2. mongodbのオブジェクトの配列を検索する方法

    3. Python3.4.1クライアントのcharbプレフィックスについてredisに接続します

    4. MongoDB:C#ドライバーで$sampleを使用する