如何在MongoDB文档中存储无符号长整型(uint64_t)数值?

6

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

我需要使用unsigned long long,因为我正在使用Twitter API,它使用无符号64位整数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。

当我尝试调用arrayBuilder.append(id)时(其中id的类型为uint64_t),这里是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。
2个回答

14
因为MongoDB/BSON仅支持带符号的64位整数,所以在与数据库交互时,您需要将64位无符号值转换为long long类型。所有的64位仍然被使用,因此您不会失去任何可用的无符号范围,只是对于使用最高有效位的值,在数据库中显示为负值。

5
当进行类型转换时(在数据库中也是如此),这些值将变为负数,但只要在读取时将它们重新转换回uint64_t,它们就能正常工作。注意不要改变原意。 - JohnnyHK
只要您不希望Mongo对这些值进行任何计算,这确实是最佳解决方案。 - bchurchill
非常感谢你,@JohnnyHK! - cmcromance

1

恕我直言,依我的意见,你最好重新考虑不使用字符串作为ID的决定,因为:

1. 由于bson内部存储64B double通常需要3个附加字段和字段名称(请参见'floatApprox','top','bottom'hereherehere),因此它可能比您想象的要高效得多。 2. 它已经作为id_str由您使用的Twitter API提供,有充分的理由。 3. 如果您曾经使用过mongodb map reduce,那么您将会在JS中转换这些数字时遇到真正的麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接