MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy kolejność ma znaczenie w bson_iter_find w sterowniku mongo c?

aby bezpośrednio odpowiedzieć na swoje pytanie, zadzwoń do bson_iter_init (http://api.mongodb. org/libbson/current/bson_iter_init.html ) dla każdego „nowego” zapytania dotyczącego danych.

Przypuszczalnie masz pojedyncze wywołanie bson_iter_init na obiekcie bson_t. Potrzebujesz tylko kolejnego.

   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.

lub po prostu użyj połączonego polecenia bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ), jeśli nie chcesz zajmować się elementami wewnętrznymi.

   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.

Jeśli interesuje Cię dlaczego, pracuję nad bsonsearch (https://github.com/bauman/bsonsearch ) biblioteki i mają podobne problemy.

Bądź bardzo ostrożny w radzeniu sobie ze wskaźnikami. Prawie wszystko pod maską w Libbson manipuluje wskaźnikami do obszaru w pamięci.

Powodem, dla którego porządkowanie mater jest to, że zainicjowałeś raz, kiedy wywołałeś iter_find, libbson przeszuka B, aby zlokalizować A . Kolejne wywołanie, aby znaleźć B, szukałoby końca bufora i go przegapiło. Możesz uniknąć tego problemu, ponownie inicjując iterator z powrotem do pozycji 0 i rozpoczynając wyszukiwanie od tego miejsca.

O ile nie wiesz dokładnie, co robisz i nie chcesz zoptymalizować wyszukiwania wokół bufora, prawdopodobnie najlepiej jest po prostu ponownie zainicjować iterator dla każdego znaleziska.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak określić wersję Meteor MongoDB na lokalnym?

  2. mongodb:użyj zagnieżdżonego dokumentu lub oddzielnych kolekcji z odniesieniami

  3. explain() w Mongodb:różnice między nscanned i nscannedObjects

  4. Jak dodać wartości do obiektu bson.D?

  5. Błąd Mongo DB:nieprawidłowy operator:$search podczas wyszukiwania $text