2012-12-21 108 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