6

我想在 MongoDB 文档中存储unsigned long long (uint64_t)类型的数字,我该怎么做?

我需要使用 unsigned long long 因为我使用的是使用无符号 64 位整数的 Twitter API https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

无符号 64 位整数类型的范围需要用 8 个字节表示,数据范围为 0 到 18,446,744,073,709,551,615。

我正在使用C++ MongoDB 驱动程序, BSONArrayBuilder类的 append 成员函数没有 unsigned long long 的重载,只有 long long。

当我尝试使用 uint64_t 类型的 id 调用 arrayBuilder.append(id) 时,出现以下错误 G++ 4.7.2:

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 使用字符串。
4

2 回答 2

13

long long因为 MongoDB/BSON 仅支持带符号的 64 位整数,所以在与数据库交互时,您需要将 64 位无符号值转换为/从。

仍然使用所有 64 位,因此您不会丢失任何可用的无符号范围,对于那些使用最高有效位的值,它只会在数据库中显示为负值。

于 2012-12-21T18:12:15.830 回答
3

恕我直言,恕我直言,您能做的最好的事情就是重新考虑您不使用字符串作为 ID 的决定,因为:

  1. 可能它比你以往任何时候都更有效率,因为在存储 64B 双精度时会产生大量的 bson 内部开销,这通常是 3 个额外的字段和字段名称(参见 'floatApprox'、'top'、bottom' hereherehere

  2. 它已由您使用的 twitter API 作为 id_str 提供,这是有充分理由的

  3. 如果您碰巧使用 mongodb map reduce,您将很难在 JS 中转换这些数字

于 2012-12-23T19:12:29.623 回答