sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Importa el orden en bson_iter_find en el controlador mongo c?

para responder directamente a su pregunta, debe llamar a bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) para cada consulta "nueva" que realice en los datos.

Presumiblemente, tiene una sola llamada bson_iter_init en un objeto bson_t. Solo necesitas otro.

   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.

o simplemente use el comando combinado bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) si no quiere lidiar con las partes internas.

   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 está interesado en saber por qué, trabajo en bsonsearch (https://github.com/bauman/bsonsearch ) biblioteca y tienen problemas similares.

Tenga mucho cuidado con la forma en que trata con los punteros. Casi todo bajo el capó en libbson está manipulando punteros a un área en la memoria.

La razón por la que ordenar es importante porque inicializaste una vez, cuando llamaste a iter_find, libbson buscaría más allá de B para ubicar A . La llamada subsiguiente para encontrar B buscaría hasta el final del búfer y lo perdería. Evita ese problema reinicializando el iterador a la posición 0 y comienza la búsqueda desde allí.

A menos que sepa exactamente lo que está haciendo y desee optimizar las búsquedas en el búfer, probablemente sea mejor reiniciar el iterador para cada búsqueda.