MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

L'ordre est-il important dans bson_iter_find dans le pilote mongo c

pour répondre directement à votre question, vous devez appeler bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) pour chaque "nouvelle" requête que vous effectuez sur les données.

Vraisemblablement, vous avez un seul appel bson_iter_init sur un objet bson_t. Vous en avez juste besoin d'un autre.

   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 utilisez simplement la commande combinée bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) si vous ne voulez pas vous occuper des internes.

   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 cela vous intéresse, je travaille sur le bsonsearch (https://github.com/bauman/bsonsearch ) bibliothèque et ont des problèmes similaires.

Soyez très prudent sur la façon dont vous traitez les pointeurs. Presque tout sous le capot de libbson manipule des pointeurs vers une zone en mémoire.

La raison pour laquelle la commande est importante est que vous avez initialisé une fois, lorsque vous avez appelé iter_find, libbson recherchait au-delà de B pour localiser A . L'appel suivant pour trouver B chercherait jusqu'à la fin du tampon et le manquerait. Vous évitez ce problème en réinitialisant l'itérateur à la position 0 et en lançant la recherche à partir de là.

À moins que vous ne sachiez exactement ce que vous faites et que vous souhaitiez optimiser les recherches autour du tampon, il est probablement préférable de simplement réinitialiser l'itérateur pour chaque recherche.