aby bezpośrednio odpowiedzieć na swoje pytanie, zadzwoń do bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) dla każdego „nowego” zapytania dotyczącego danych.
Przypuszczalnie masz pojedyncze wywołanie bson_iter_init na obiekcie bson_t. Potrzebujesz tylko kolejnego.
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.
lub po prostu użyj połączonego polecenia bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ), jeśli nie chcesz zajmować się elementami wewnętrznymi.
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.
Jeśli interesuje Cię dlaczego, pracuję nad bsonsearch (https://github.com/bauman/bsonsearch ) biblioteki i mają podobne problemy.
Bądź bardzo ostrożny w radzeniu sobie ze wskaźnikami. Prawie wszystko pod maską w Libbson manipuluje wskaźnikami do obszaru w pamięci.
Powodem, dla którego porządkowanie mater jest to, że zainicjowałeś raz, kiedy wywołałeś iter_find, libbson przeszuka B, aby zlokalizować A . Kolejne wywołanie, aby znaleźć B, szukałoby końca bufora i go przegapiło. Możesz uniknąć tego problemu, ponownie inicjując iterator z powrotem do pozycji 0 i rozpoczynając wyszukiwanie od tego miejsca.
O ile nie wiesz dokładnie, co robisz i nie chcesz zoptymalizować wyszukiwania wokół bufora, prawdopodobnie najlepiej jest po prostu ponownie zainicjować iterator dla każdego znaleziska.