para responder diretamente à sua pergunta, você deve ligar para bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) para cada "nova" consulta que você está fazendo nos dados.
Presumivelmente, você tem uma única chamada bson_iter_init em um objeto bson_t. Você só precisa de outro.
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.
ou, apenas use o comando combinado bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) se você não quiser lidar com os internos.
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.
Se você estiver interessado no porquê, eu trabalho no bsonsearch (https://github.com/bauman/bsonsearch ) e têm problemas semelhantes.
Seja muito cauteloso em como você está lidando com ponteiros. Quase tudo sob o capô na libbson está manipulando ponteiros para uma área na memória.
O motivo da ordenação é porque você inicializou uma vez, quando chamou iter_find, a libbson procuraria além de B para localizar A . A chamada subsequente para encontrar B buscaria o final do buffer e o perderia. Você evita esse problema reinicializando o iterador de volta à posição 0 e inicia a busca a partir daí.
A menos que você saiba exatamente o que está fazendo e queira otimizar buscas ao redor do buffer, provavelmente é melhor apenas reinicializar o iterador para cada busca.