för att direkt svara på din fråga bör du ringa bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) för varje enskild "ny" fråga du gör mot data.
Förmodligen har du ett enda bson_iter_init-anrop på ett bson_t-objekt. Du behöver bara en till.
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.
eller använd bara det kombinerade kommandot bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) om du inte vill ta itu med internerna.
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.
Om du är intresserad av varför jobbar jag med bsonsearch (https://github.com/bauman/bsonsearch ) bibliotek och har liknande problem.
Var mycket försiktig med hur du hanterar tips. Nästan allt under huven i libbson manipulerar pekare till ett område i minnet.
Anledningen till att beställa maters är att du initierade en gång, när du anropade iter_find, libbson skulle söka förbi B för att hitta A . Det efterföljande anropet för att hitta B skulle söka till slutet av bufferten och missa det. Du undviker det problemet genom att återinitiera iteratorn till position 0 och starta sökningen därifrån.
Om du inte vet exakt vad du gör och vill optimera sökningar runt bufferten, är det förmodligen bäst att bara återinitiera iteratorn för varje fynd.