MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

A ordem importa em bson_iter_find no driver mongo c


para responder diretamente à sua pergunta, você deve ligar para bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) para cada "nova" consulta que você está fazendo nos dados.

Presumivelmente, você tem uma única chamada bson_iter_init em um objeto bson_t. Você só precisa de outro.
   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, apenas use o comando combinado bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) se você não quiser lidar com os internos.
   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.

Se você estiver interessado no porquê, eu trabalho no bsonsearch (https://github.com/bauman/bsonsearch ) e têm problemas semelhantes.

Seja muito cauteloso em como você está lidando com ponteiros. Quase tudo sob o capô na libbson está manipulando ponteiros para uma área na memória.

O motivo da ordenação é porque você inicializou uma vez, quando chamou iter_find, a libbson procuraria além de B para localizar A . A chamada subsequente para encontrar B buscaria o final do buffer e o perderia. Você evita esse problema reinicializando o iterador de volta à posição 0 e inicia a busca a partir daí.

A menos que você saiba exatamente o que está fazendo e queira otimizar buscas ao redor do buffer, provavelmente é melhor apenas reinicializar o iterador para cada busca.