за да отговорите директно на въпроса си, трябва да се обадите на bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) за всяка отделна „нова“ заявка, която правите спрямо данните.
Предполага се, че имате едно извикване на bson_iter_init на bson_t обект. Просто имате нужда от друг.
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 манипулира указатели към област в паметта.
Причината за подреждането на maters е, че сте инициализирали веднъж, когато сте извикали iter_find, libbson ще търси след B, за да намери A . Последващото извикване за намиране на B ще търси края на буфера и ще го пропусне. Вие избягвате този проблем, като инициализирате отново итератора обратно в позиция 0 и започнете търсенето от там.
Освен ако не знаете точно какво правите и искате да оптимизирате търсенето около буфера, вероятно е най-добре просто да инициализирате повторно итератора за всяко намиране.