para responder directamente a su pregunta, debe llamar a bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) para cada consulta "nueva" que realice en los datos.
Presumiblemente, tiene una sola llamada bson_iter_init en un objeto bson_t. Solo necesitas otro.
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.
o simplemente use el comando combinado bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) si no quiere lidiar con las partes internas.
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.
Si está interesado en saber por qué, trabajo en bsonsearch (https://github.com/bauman/bsonsearch ) biblioteca y tienen problemas similares.
Tenga mucho cuidado con la forma en que trata con los punteros. Casi todo bajo el capó en libbson está manipulando punteros a un área en la memoria.
La razón por la que ordenar es importante porque inicializaste una vez, cuando llamaste a iter_find, libbson buscaría más allá de B para ubicar A . La llamada subsiguiente para encontrar B buscaría hasta el final del búfer y lo perdería. Evita ese problema reinicializando el iterador a la posición 0 y comienza la búsqueda desde allí.
A menos que sepa exactamente lo que está haciendo y desee optimizar las búsquedas en el búfer, probablemente sea mejor reiniciar el iterador para cada búsqueda.