2012-01-11 4 views
1

pongongo를 사용하여 mongodb에 64 비트 부호없는 정수를 삽입하려고합니다. 정수는 CRC64 알고리즘의 출력입니다. 내가 다음에 시도 : 나는 MongoDB에이 점을 삽입하면pymongo 64bit 부호없는 정수

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

는 단지 64 비트 정수 MongoDB를 지원하는 불평하기 시작합니다. 내 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 
    } 
} 

여기에 어떤 현상이 발생합니까? 어떤 int 방법으로 db에 int 형으로 넣을 수 있습니까? (부호가 있거나 부호가없는 것은 실제로 신경 쓰지 마십시오.)

+0

32 비트 또는 64 비트 시스템에서 mongo를 실행 하시겠습니까? – milan

+0

바이너리로 인코딩 해 보셨습니까? – incognick

답변

5

MongoDB는 BSON을 사용하여 데이터를 저장하며 BSON 사양에 따르면 64 비트 정수가 서명됩니다 .

64 비트 시스템에서 샘플 세션, 64 비트 몽고의 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 비트 정수가 아닙니다. – milan

관련 문제