2012-12-21 68 views
5

我想将unsigned long long(uint64_t)中的数字存储在MongoDB文档中,我该怎么做?如何将unsigned long long(uint64_t)值存储在MongoDB文档中?

我需要,因为我使用利用无符号的64个整数https://dev.twitter.com/docs/twitter-ids-json-and-snowflake微博API使用无符号长长

需要由8个字节,并用数据来represended的无符号64位整数类型的范围范围0至18,446,744,073,709,551,615。

我使用的是C++ MongoDB driverBSONArrayBuilder类的追加成员函数没有unsigned long long的重载,只有很长的long。

这里的错误G ++ 4.7.2吐出来的时候我打电话arrayBuilder.append(ID),类型uint64_t中的ID:

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

恕我直言,恕我直言,你能做的最好的事情是要考虑你的决定不使用字符串的ID,因为:

  1. 或许它比你更有效以往虽然由于存储64B双这通常是3个额外的域和域名(见“floatApprox”,“顶部”,“底部hereherehere

  2. 它是由微博已提供作为ID_STR时BSON内部的开销的量您使用的API有很好的理由

  3. 你将有真正的麻烦在JS铸造这些数字如果 你碰巧使用MongoDB的地图减少

9

因为MongoDB的/ BSON只支持有符号64位整数,则需要与数据库进行交互时,从long long投你的64位无符号值/。

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

+3

@BadDesign这些值将变为负时,铸铁(以及DB),但只要你读回'uint64_t'就可以使它回到原来的状态。 – JohnnyHK

+0

只要您不希望Mongo对这些值进行任何计算,这真的是最好的解决方案。 – bchurchill

+0

非常感谢你@JohnnyHK! – cmcromance