如何在MongoDB文档中存储无符号的long long(uint64_t)值?

问题描述:

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

I want to store numbers of type unsigned long long (uint64_t) in a MongoDB document, how do I do it?

我需要长时间使用无符号,因为我正在使用使用无符号64位整数的Twitter API https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

I need to use unsigned long long because I'm using Twitter API which uses unsigned 64 bit integers https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

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

The range of the the unsigned 64 bit integral type needs to be represended by 8 bytes and with a data range of 0 to 18,446,744,073,709,551,615.

我正在使用 C ++ MongoDB驱动程序和附加成员 BSONArrayBuilder 类的函数没有对unsigned long long的重载,仅很久很久了.

I'm using the C++ MongoDB driver and the append member function of the BSONArrayBuilder class doesn't have an overload for unsigned long long, only for long long.

这是我尝试调用id为uint64_t类型的arrayBuilder.append(id)时出现的G ++ 4.7.2错误:

Here's the error G++ 4.7.2 spits out when I try to call arrayBuilder.append(id), with an id of type 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规范已将int64定义为8个字节(64位整数).
  • 我不想使用字符串作为ID.
    • I know that the BSON specification has int64 defined as 8 bytes (64-bit signed integer).
    • I do NOT want to use a string for the ID.

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

With all due respect, IMHO the best thing you can do is to reconsider your decision not to use string for the ID since:

  1. 它可能比您有效率,但是由于存储64B double时bson内部的开销很大,通常是3个附加字段和字段名(请参阅'floatApprox','top',bottom' 此处您正使用的twitter API已将其作为id_str提供

    it is already provided as id_str by twitter API you are using for good reason

    如果出现以下情况,您将很难在JS中强制转换这些数字 您碰巧使用过mongodb map reduce

    you are going to have real trouble casting those numbers in JS if you ever happen to use mongodb map reduce