Ошибка переполнения Mongoengine LongField

У меня есть текстовая модель;

class Text(db.Document):
    siphash_value = db.LongField()

Затем я использую siphash lib для создания хеша. (https://github.com/majek/pysiphash)

Эта библиотека преобразует строку в длинное значение, например 12398370950267227270L.

Если я попытаюсь сохранить документ в свою базу данных;

Text(siphash_value=12398370950267227270L).save()

Я получаю эту ошибку:

OverflowError: MongoDB can only handle up to 8-byte ints

person Community    schedule 09.09.2013    source источник
comment
Сейчас я использую эту библиотеку github.com/bozhu/siphash-python и отлично работаю.   -  person    schedule 09.09.2013


Ответы (2)


MongoDB поддерживает только 64-битные целые числа (bson.spec), поэтому pymongo не может преобразовать Long, отсюда и ошибка.

person Ross    schedule 16.09.2013
comment
Поэтому мне пришлось использовать алгоритм crc32, а не siphash. - person ; 17.09.2013

Не могли бы вы рассказать нам, ПОЧЕМУ это работает сейчас? Новая библиотека возвращает не длинное поле? (Я не могу комментировать ваш собственный ответ, потому что у меня меньше 50 репутации, извините за все).

Я попытался заменить LongField на FloatField, и это сработало. И на самом деле он имеет тот же результат. Просто было другое обозначение (1.2398370950267228e+19).

person Mauricio Abreu    schedule 09.09.2013
comment
Так кто быстрее по скорости? Флотфилд против Лонгфилда? - person ; 16.09.2013
comment
FloatField имеет ширину 64 бита, поэтому число является лишь приближением исходного числа. - person Messa; 24.06.2016