2012-12-21 16 views
5

Tôi muốn lưu trữ số kiểu unsigned long long (uint64_t) trong tài liệu MongoDB, làm cách nào để thực hiện?Làm cách nào để lưu trữ các giá trị dài (uint64_t) chưa được ký trong tài liệu MongoDB?

tôi cần phải sử dụng unsigned dài dài vì tôi đang sử dụng Twitter API trong đó sử dụng unsigned số nguyên 64 bit https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

Phạm vi của các loại không thể thiếu 64 bit unsigned cần được represended 8 byte và với một dữ liệu phạm vi từ 0 đến 18,446,744,073,709,551,615.

Tôi đang sử dụng C++ MongoDB driver và chức năng thành viên phụ thêm của lớp BSONArrayBuilder không bị quá tải cho unsigned long long, chỉ trong thời gian dài.

Đây là lỗi G ++ 4.7.2 spits ra khi tôi cố gắng gọi arrayBuilder.append (id), với id của loại 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) 
  • Tôi biết rằng BSON specification đã Int64 định nghĩa là 8 byte (64-bit số nguyên đã ký).
  • Tôi KHÔNG muốn sử dụng chuỗi cho ID.

Trả lời

2

Với tất cả sự tôn trọng, IMHO điều tốt nhất bạn có thể làm là xem xét lại quyết định của bạn không sử dụng chuỗi cho ID từ:

  1. lẽ nó là nhiều hơn nữa hiệu quả hơn bao giờ bạn mặc dù do lượng overhead của ruột bson khi lưu trữ 64B đôi mà thường là 3 trường bổ sung và tên trường (xem 'floatApprox', 'top', đáy' here, herehere)

  2. nó đã được cung cấp như ID_STR bởi twitter API bạn đang sử dụng vì lý do chính đáng

  3. bạn sẽ gặp khó khăn khi thực đúc những con số trong JS nếu bạn đã bao giờ xảy ra để sử dụng bản đồ MongoDB giảm

9

Vì MongoDB/BSON chỉ hỗ trợ chữ ký số nguyên 64-bit, bạn sẽ cần phải cast giá trị unsigned 64-bit của bạn đến/từ long long khi tương tác với cơ sở dữ liệu.

Tất cả 64 bit vẫn được sử dụng, do đó bạn sẽ không mất bất kỳ phạm vi không có sẵn nào, nó sẽ chỉ hiển thị dưới dạng giá trị âm trong cơ sở dữ liệu cho các giá trị sử dụng bit quan trọng nhất.

+3

@BadDesign Những giá trị này sẽ đi khi dàn diễn viên tiêu cực (và trong DB), nhưng miễn là bạn đưa chúng trở lại 'uint64_t' khi đọc lại nó hoạt động. – JohnnyHK

+0

Đây thực sự là giải pháp tốt nhất miễn là bạn không muốn Mongo thực hiện bất kỳ tính toán nào trên các giá trị đó. – bchurchill

+0

Cảm ơn bạn rất nhiều @JohnnyHK! – cmcromance