pymongo 64-битное целое число без знака - PullRequest
1 голос
/ 11 января 2012

Я пытаюсь вставить 64-битное целое число без знака в mongodb, используя pymongo. Целое число является выходом алгоритма CRC64. Я пытался следующее:

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

Если я вставлю это в mongodb, он начнет жаловаться, что mongodb поддерживает только 64-битные целые числа. Затем я попытался преобразовать его в 64-битный int со знаком так:

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

Какой тип работы, mongodb перестает жаловаться на размер моего int, но когда я смотрю на данные в mongodb, я получаю это:

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

Что здесь происходит? Есть ли способ поместить 64-битное int в db как просто int (на самом деле все равно, подписано оно или нет).

1 Ответ

5 голосов
/ 11 января 2012

MongoDB использует BSON для хранения данных, а спецификация BSON гласит, что 64-битные целые числа подписаны.

Пример сеанса на 64-битной машине, 64-битной Mongo v2.0.1, Python 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") }
> 
...