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

时间:2012-12-21 17:21:50

标签: c++ mongodb twitter mongodb-query

我想在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 driver并且BSONArrayBuilder类的追加成员函数没有超符号用于无符号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 specification将int64定义为8个字节(64位有符号整数)。
  • 我不想为ID使用字符串。

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:2)

尽管如此,恕我直言,你可以做的最好的事情就是重新考虑你决定不使用字符串作为ID:

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

  2. 它已经由你正在使用的推特API提供为id_str

  3. 如果你在JS中输入这些数字真的很麻烦 你碰巧使用mongodb map reduce