Chcete-li přímo odpovědět na vaši otázku, měli byste zavolat bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) pro každý jednotlivý „nový“ dotaz, který na data zadáte.
Pravděpodobně máte jediné volání bson_iter_init na objektu bson_t. Potřebujete jen další.
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.
nebo stačí použít kombinovaný příkaz bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ), pokud se nechcete zabývat vnitřnostmi.
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.
Pokud vás zajímá proč, pracuji na bsonsearch (https://github.com/bauman/bsonsearch ) a mají podobné problémy.
Buďte velmi opatrní, jak nakládáte s ukazateli. Téměř vše pod kapotou v libbsonu manipuluje s ukazateli na oblast v paměti.
Důvodem pro objednávání je to, že jste jednou inicializovali, když jste zavolali iter_find, libbson by hledal za B, aby našel A . Následné volání k nalezení B by hledalo konec vyrovnávací paměti a minulo ho. Tomuto problému se vyhnete tím, že znovu inicializujete iterátor zpět do pozice 0 a spustíte vyhledávání odtud.
Pokud přesně nevíte, co děláte, a nechcete optimalizovat hledání ve vyrovnávací paměti, bude pravděpodobně nejlepší znovu inicializovat iterátor pro každé hledání.