6

unsigned long long(uint64_t)型の数値をMongoDBドキュメントに保存したいのですが、どうすればよいですか?

符号なし64ビット整数を使用するTwitterAPIを使用しているため、unsignedlonglongを使用する必要があります https://dev.twitter.com/docs/twitter-ids-json-and-snowflake

符号なし64ビット整数型の範囲は、8バイトで表され、データ範囲は0〜18,446,744,073,709,551,615である必要があります。

私はC++MongoDBドライバーを使用していますが、 BSONArrayBuilderクラスのappend member関数には、unsigned long longのオーバーロードはなく、longlongのみがあります。

これは、タイプuint64_tのIDでarrayBuilder.append(id)を呼び出そうとすると、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に文字列を使用したくありません。
4

2 に答える 2

13

MongoDB / BSONは符号付き64ビット整数のみをサポートするためlong long、データベースと対話するときに64ビットの符号なし値をキャストする必要があります。

すべての64ビットが引き続き使用されるため、使用可能な符号なし範囲が失われることはありません。最上位ビットを使用する値については、データベースに負の値として表示されるだけです。

于 2012-12-21T18:12:15.830 に答える
3

敬意を払って、IMHOができる最善のことは、次の理由からIDに文字列を使用しないという決定を再検討することです。

  1. 64B doubleを格納するときのbson内部のオーバーヘッドの量により、おそらくこれまでよりもはるかに効率的です。これは通常、3つの追加フィールドとフィールド名です(「floatExplicit」、「top」、「bottom」 、ここここ 、およびここを参照)

  2. 正当な理由で使用しているTwitterAPIによってid_strとしてすでに提供されています

  3. mongodb map reduceを使用したことがある場合、JSでこれらの数値をキャストするのは非常に困難です。

于 2012-12-23T19:12:29.623 に答える