2012-01-11 19 views
1

pongongoを使用してmongodbに64ビット符号なし整数を挿入しようとしています。整数はCRC64アルゴリズムの出力です。pymongo 64bit符号なし整数

long(crc64(unicode(kw).encode('unicode-escape')))) 

これをmongodbに挿入すると、mongodbで64ビットの整数しかサポートされないと不平を言ってきます。私のint型の大きさに文句を停止しMongoDBの作品の

ctypes.c_int64(crc64(unicode(kw).encode('unicode-escape')))).value 

どのようなもの、が、私はMongoDBのデータを見たとき、私はこれを取得::次の私はそうのように署名した64ビットのint型に変換しようとした

{ 
    "_id" : { 
     "floatApprox" : -5307924876159732000, 
     "top" : 3059119730, 
     "bottom" : 2651469802 }, 
    "keyword" : "redacted", 
    "normal_hash" : { 
     "floatApprox" : -671156942315906300, 
     "top" : 4138701393, 
     "bottom" : 549001936 
    } 
} 

ここでは何が起こっていますか?

+0

32bitまたは64bitマシンでmongoを実行していますか? – milan

+0

バイナリとしてエンコードしようとしましたか? – incognick

答えて

5

MongoDBはBSONを使用してデータを保存し、BSON仕様では64ビットの整数に符号が付けられているとのことです。 。

64ビットマシン、64ビットのmongo v2.0.1の、パイソン2.6.5のサンプルセッション:

>>> num = long(9007199254740992) 
>>> num 
9007199254740992L 
>>> bson = BSON.encode({"crc64":num}) 
>>> bson 
'\x14\x00\x00\x00\x12crc64\x00\x00\x00\x00\x00\x00\x00 \x00\x00' 
>>> bson_str = bson.decode() 
>>> bson_str 
{u'crc64': 9007199254740992} 
>>> 

と、このスクリプトを実行している:

db.foo.save({"_id" : 1, "crc64" : long(9007199254740992)}); 

for doc in db.foo.find({"_id" : 1 }): 
    crc = doc["crc64"] 
    print("crc type: " + str(type(crc))) 

プリント:

crc type: <type 'int'> 

およびマンゴーシェル由来:

> db.foo.findOne() 
{ "_id" : 1, "crc64" : NumberLong("9007199254740992") } 
> 
+0

あなたのロングは十分に長くはありません。上記のように、9007199254740992の代わりに2 ** 64を実行してみてください。mongoに関する限り、その数は大きすぎるため、OverflowErrorが発生します。あなたがそれをint64に変換しない限り(それは署名されています) – Blubber

+1

私が言ったように、64ビットの数字は[-2^63,2^63-1]の範囲を意味するので、2^64を持つことはできません。 9007199254740992は確かに32ビットintではありません。 – milan

関連する問題