L’ordre at-il une importance dans bson_iter_find dans le pilote mongo c

J’utilise le pilote 1.1 mongo c avec la version 3.0 de Mongo. Libbson version 1.1. J’utilise un iterator pour rechercher certains champs dans un document. Le code suivant ne fonctionne que lorsque “fieldA” est supérieur à “fieldB” dans mongodb. Si je change l’ordre, bson_iter_find renvoie false.

if(bson_iter_find(&iterator,"fieldA")){ pintf("fieldA"); } if(bson_iter_find(&iterator,"fieldB")){ pintf("fieldB"); } 

Dans les anciennes versions de libbson (0.4), je pouvais utiliser bson_find () pour rechercher des champs dans un document. Existe-t-il quelque chose de similaire que je puisse utiliser dans la nouvelle bibliothèque libbson?

Lien vers la nouvelle bibliothèque libbson https://api.mongodb.org/libbson/current/

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.

Vous avez probablement un seul appel bson_iter_init sur un object bson_t. Vous 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 éléments 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 la bibliothèque bsonsearch ( https://github.com/bauman/bsonsearch ) et j’ai des problèmes similaires.

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

Si vous avez initialisé une fois, lorsque vous avez appelé iter_find, libbson recherchait le passé B pour localiser A. L’appel suivant pour trouver B chercherait la fin du tampon et le manquerait. Vous évitez ce problème en réinitialisant l’iterator à la position 0 et en démarrant la recherche à partir de là.

Sauf si vous savez exactement ce que vous faites et souhaitez optimiser les recherches autour du tampon, il est probablement préférable de simplement réinitialiser l’iterator à chaque recherche.