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

mongocドライバーのbson_iter_findで順序は重要ですか

    質問に直接回答するには、bson_iter_init(http://api.mongodbに電話する必要があります。 org / libbson / current / bson_iter_init.html )データに対して行うすべての「新しい」クエリに対して。

    おそらく、bson_tオブジェクトに対して単一のbson_iter_init呼び出しがあります。別のものが必要です。

       bson_iter_t iterator1;
       bson_iter_t iterator2;
    
       if (bson_iter_init (&iterator1, doc) &&
           bson_iter_find (&iterator1, "fieldA") ) {
           //Do something with fieldA
        }
    
       if (bson_iter_init (&iterator2, doc) &&
           bson_iter_find (&iterator2, "fieldB") ) {
           //Do something with fieldB
        }
        bson_free(doc); //DONT FORGET TO DESTROY THE BSON_T object at the end.
    

    または、組み合わせたコマンドbson_iter_init_find( http://api.mongodb.org/ libbson / current / bson_iter_init_find.html )内部を扱いたくない場合。

       bson_iter_t iterator1;
       bson_iter_t iterator2;
    
       if (bson_iter_init_find (&iterator1, doc, "fieldA") ) {
           //Do something with fieldA
        }
    
       if (bson_iter_init_find (&iterator2, doc,"fieldB") ) {
           //Do something with fieldB
        }
        bson_free(doc); //DONT FORGET TO DESTROY THE BSON_T object at the end.
    

    理由に興味がある場合は、bsonsearch( https://github.com/bauman/bsonsearch )ライブラリと同様の問題があります。

    ポインタの扱い方には十分注意してください。 libbsonの内部のほぼすべてが、メモリ内の領域へのポインタを操作しています。

    マテリアルを注文する理由は、一度初期化したためです。iter_findを呼び出すと、libbsonはBを超えてAを探します 。 Bを見つけるための後続の呼び出しは、バッファーの最後をシークし、それを見逃します。イテレータを位置0に再初期化し、そこからシークを開始することで、この問題を回避します。

    何をしているのかを正確に理解していて、バッファ周辺のシークを最適化したい場合を除いて、検索ごとにイテレータを再初期化するのがおそらく最善です。




    1. mongoDBへのRESTAJAXリクエスト

    2. Apache Hadoopアーキテクチャ– HDFS、YARN、MapReduce

    3. AzureでのMongoDBホスティングを改善するための5つのヒント

    4. リレーショナルデータベースと比較して、MongoDBのようなスキーマフリーデータベースを使用する利点は何ですか?