如何在MongoDB文档中存储unsigned long (uint64_t)值

How to store unsigned long long (uint64_t) values in a MongoDB document?

本文关键字:uint64 long unsigned MongoDB 文档 存储      更新时间:2023-10-16

我想在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的决定,因为:

  1. 可能比你以前更有效,因为存储64B double时bson内部的开销通常是3个额外的字段和字段名(见'floatApprox','top', ' bottom'这里,这里和这里)

  2. 它已经作为id_str由您正在使用的twitter API提供了很好的理由

  3. 你将有真正的麻烦在JS中铸造这些数字如果你有没有碰巧使用mongodb map reduce

相关文章: