MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Spielt die Reihenfolge in bson_iter_find im Mongo-C-Treiber eine Rolle?

Um Ihre Frage direkt zu beantworten, sollten Sie bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) für jede einzelne "neue" Abfrage, die Sie für die Daten durchführen.

Vermutlich haben Sie einen einzelnen bson_iter_init-Aufruf für ein bson_t-Objekt. Du brauchst nur noch einen.

   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.

oder verwenden Sie einfach den kombinierten Befehl bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ), wenn Sie sich nicht mit den Interna befassen möchten.

   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.

Wenn Sie daran interessiert sind, warum, ich arbeite an der bsonsearch (https://github.com/bauman/bsonsearch )-Bibliothek und haben ähnliche Probleme.

Seien Sie sehr vorsichtig, wie Sie mit Zeigern umgehen. Fast alles unter der Haube von libbson manipuliert Zeiger auf einen Bereich im Speicher.

Der Grund für das Sortieren von Maters ist, dass Sie einmal initialisiert haben, als Sie iter_find aufgerufen haben, libbson hinter B suchen würde, um A zu lokalisieren . Der nachfolgende Aufruf, B zu finden, würde bis zum Ende des Puffers suchen und ihn verfehlen. Sie vermeiden dieses Problem, indem Sie den Iterator wieder auf Position 0 initialisieren und die Suche von dort aus starten.

Wenn Sie nicht genau wissen, was Sie tun, und Suchvorgänge um den Puffer herum optimieren möchten, ist es wahrscheinlich am besten, den Iterator einfach für jeden Fund neu zu initialisieren.