2012-12-21 9 views
5

Chcę przechowywać numery typu unsigned long long (uint64_t) w dokumencie MongoDB, jak to zrobić?Jak przechowywać niepodpisane długo długie (uint64_t) wartości w dokumencie MongoDB?

muszę używać unsigned long long ponieważ używam API Twittera, który wykorzystuje 64-bitowe liczby całkowite bez znaku https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

Zasięg do 64-bitowych bez znaku typu integralnego należy represended przez 8 bajtów iz danymi zakres od 0 do 18 446 744 070 709 551 615.

Używam funkcji C++ MongoDB driver, a funkcja dołączania członka klasy BSONArrayBuilder nie ma przeciążenia dla niepodpisanej długiej długości, tylko przez długi czas.

Oto błąd G ++ 4.7.2 wyrzuca z siebie, gdy próbuję zadzwonić arrayBuilder.append (ID), z identyfikatorem typu uint64_t:

MongoDB/mongo/db/../bson/bson-inl.h:342:9: error: call of overloaded ‘append(const char*&, long long unsigned int&)’ is ambiguous 
MongoDB/mongo/db/../bson/bsonobjbuilder.h:167:25: note: mongo::BSONObjBuilder& mongo::BSONObjBuilder::append(const mongo::StringData&, bool) 
MongoDB/mongo/db/../bson/bsonobjbuilder.h:175:25: note: virtual mongo::BSONObjBuilder& mongo::BSONObjBuilder::append(const mongo::StringData&, int) 
MongoDB/mongo/db/../bson/bsonobjbuilder.h:183:25: note: mongo::BSONObjBuilder& mongo::BSONObjBuilder::append(const mongo::StringData&, unsigned int) 
MongoDB/mongo/db/../bson/bsonobjbuilder.h:188:25: note: virtual mongo::BSONObjBuilder& mongo::BSONObjBuilder::append(const mongo::StringData&, long long int) 
MongoDB/mongo/db/../bson/bsonobjbuilder.h:244:25: note: virtual mongo::BSONObjBuilder& mongo::BSONObjBuilder::append(const mongo::StringData&, double) 
MongoDB/mongo/db/../bson/bsonobjbuilder.h:324:25: note: mongo::BSONObjBuilder& mongo::BSONObjBuilder::append(const mongo::StringData&, mongo::Date_t) 
  • wiem, że BSON specification został zdefiniowany jako Int64 8 bajtów (64-bitowa ze znakiem liczba całkowita).
  • NIE chcę używać ciągów do identyfikatora.

Odpowiedz

2

Z całym szacunkiem, IMHO najlepsza rzecz, jaką można zrobić, to rozważyć swoją decyzję, aby nie używać znaków dla identyfikatora od:

  1. prawdopodobnie jest o wiele bardziej wydajny niż kiedykolwiek choć ze względu na wysokość narzutu wewnętrznych bson podczas przechowywania 64B podwójne, które zwykle 3 dodatkowe pola i nazwy pól (patrz „floatApprox”, „top”, na dole”here, here i here)

  2. jest już dostarczono jako id_str przez Twitter Interfejs API, którego używasz z dobrego powodu:

  3. będziesz mieć prawdziwe kłopoty odlewy te numery w JS jeśli kiedykolwiek zdarzy się używać MongoDB mapa zmniejszyć

9

Ponieważ MongoDB/BSON obsługuje tylko podpisał 64-bitowe liczby całkowite, musisz oddać swoje 64-bitowych wartości niepodpisanych do/z long long podczas interakcji z bazą.

Wszystkie 64-bitowe są nadal używane, więc nie stracisz żadnego z dostępnych niepodpisanych zakresów, pokaże się jako wartość ujemna w bazie danych dla tych wartości, które używają najbardziej znaczącego bitu.

+3

@BadDesign Wartości te pójdą ujemna, gdy obsady (aw DB), ale tak długo, jak odsyłasz je do 'uint64_t' gdy czytasz z powrotem, działa. – JohnnyHK

+0

To jest naprawdę najlepsze rozwiązanie, o ile nie chcesz, aby Mongo wykonywał jakiekolwiek obliczenia na tych wartościach. – bchurchill

+0

Dziękuję bardzo @JohnnyHK! – cmcromance

Powiązane problemy