for at besvare dit spørgsmål direkte, skal du ringe til bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) for hver enkelt "nye" forespørgsel, du laver mod dataene.
Formentlig har du et enkelt bson_iter_init-kald på et bson_t-objekt. Du skal bare have en til.
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 brug bare den kombinerede kommando bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ), hvis du ikke ønsker at beskæftige dig med det indre.
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.
Hvis du er interesseret i hvorfor, arbejder jeg på bsonsearch (https://github.com/bauman/bsonsearch ) bibliotek og har lignende problemer.
Vær meget forsigtig med, hvordan du håndterer pointer. Næsten alt under motorhjelmen i libbson manipulerer pointere til et område i hukommelsen.
Grunden til at bestille maters er, fordi du initialiserede én gang, da du kaldte iter_find, ville libbson søge forbi B for at finde A . Det efterfølgende kald for at finde B ville søge til slutningen af bufferen og savne den. Du undgår det problem ved at geninitialisere iteratoren tilbage til position 0 og starte søgningen derfra.
Medmindre du ved præcis, hvad du laver og ønsker at optimere søgninger omkring bufferen, er det nok bedst blot at geninitialisere iteratoren for hvert fund.