sql >> Database >  >> NoSQL >> MongoDB

Is de volgorde van belang in bson_iter_find in mongo c driver?

om uw vraag direct te beantwoorden, moet u bson_iter_init bellen (http://api.mongodb. org/libbson/current/bson_iter_init.html ) voor elke "nieuwe" query die u op de gegevens plaatst.

Vermoedelijk heb je een enkele bson_iter_init-aanroep op een bson_t-object. Je hebt er gewoon nog een nodig.

   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.

of gebruik gewoon het gecombineerde commando bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) als u niet met de interne zaken wilt omgaan.

   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.

Als je geïnteresseerd bent in waarom, werk ik aan de bsonsearch (https://github.com/bauman/bsonsearch ) bibliotheek en hebben vergelijkbare problemen.

Wees zeer voorzichtig met hoe u omgaat met pointers. Bijna alles onder de motorkap in libbson manipuleert verwijzingen naar een gebied in het geheugen.

De reden waarom het bestellen van zaken is, is omdat je eenmaal hebt geïnitialiseerd, toen je iter_find aanriep, libbson langs B zou zoeken om A te lokaliseren . De volgende oproep om B te vinden, zou naar het einde van de buffer zoeken en deze missen. U vermijdt dat probleem door de iterator opnieuw te initialiseren naar positie 0 en het zoeken vanaf daar te starten.

Tenzij je precies weet wat je doet en zoekacties rond de buffer wilt optimaliseren, is het waarschijnlijk het beste om de iterator voor elke vondst opnieuw te initialiseren.




  1. Mongodb tellen Documenten

  2. MongoDB:kan sockets niet instellen tijdens opstarten

  3. Hoe array op mangoest doc-object te vinden?

  4. Correcte syntaxis om mongodump van mongoDb docker-instantie te doen?