如何在MongoDB文档中存储unsigned long (uint64_t)值
How to store unsigned long long (uint64_t) values in a MongoDB document?
我想在MongoDB文档中存储类型unsigned long long (uint64_t)的数字,我该怎么做?
我需要使用unsigned long long因为我使用Twitter API使用unsigned 64位整数https://dev.twitter.com/docs/twitter-ids-json-and-snowflake
无符号64位整型的范围需要用8字节表示,数据范围为0到18,446,744,073,709,551,615。
我正在使用c++ MongoDB驱动程序和BSONArrayBuilder类的附加成员函数没有重载unsigned long long,只有long long。
当我尝试调用arrayBuilder.append(id)时,这里是g++ 4.7.2抛出的错误,id类型为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)
- 我知道BSON规范将int64定义为8字节(64位有符号整数)。
- 我不想使用字符串作为ID。
因为MongoDB/BSON只支持有符号的64位整数,所以在与数据库交互时,您需要将64位无符号值从long long
中强制转换。
所有64位仍然被使用,所以你不会失去任何可用的无符号范围,它只会在数据库中显示为使用最高有效位的值的负值。
恕我直言,您能做的最好的事情是重新考虑不使用字符串作为ID的决定,因为:
-
可能比你以前更有效,因为存储64B double时bson内部的开销通常是3个额外的字段和字段名(见'floatApprox','top', ' bottom'这里,这里和这里)
-
它已经作为id_str由您正在使用的twitter API提供了很好的理由
-
你将有真正的麻烦在JS中铸造这些数字如果你有没有碰巧使用mongodb map reduce
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 关于uint64的atomic_fetch_add的奇怪行为
- 从 long 转换C++位集构造函数的复杂性是多少?
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 以0开头的值初始化long-long会导致奇怪的值
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- cudaMallocManaged with vector<complex<long double> > C++ - NVIDIA CUDA
- 为什么我的函数返回 long long 返回 705032704?
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 为什么 UInt64 变量不能包含大于 UInt32::Max 的值?
- long/int到UINT64的转换,并在C#上返回long-何时可以丢失数据