質問に直接回答するには、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に再初期化し、そこからシークを開始することで、この問題を回避します。
何をしているのかを正確に理解していて、バッファ周辺のシークを最適化したい場合を除いて、検索ごとにイテレータを再初期化するのがおそらく最善です。