MongoDB и большие числовые идентификаторы документов

MongoDB использует формат BSON для хранения данных на диске. BSON определяет различные типы данных, в том числе подписанный int64 для хранения больших целых чисел.

Попробуем сохранить документ с большим ID (887190505588098573), который укладывается в диапазон подписанных int64 (его абсолютное значение меньше 2^63)

> db.query.insert({_id: 887190505588098573, 'q': 'zzz'})
> db.query.find({_id: 887190505588098573})
{ "_id" : 887190505588098600, "q" : "zzz" }

Что ж, мы получили ответ с идентификатором документа, который отличается от запрошенного идентификатора.

Что мне не хватает?


person Stack Exchange User    schedule 13.06.2014    source источник


Ответы (2)


Javascript не может обрабатывать такое большое число - обрабатывает только целые числа до 2^53.

Вы можете увидеть это, поместив 887190505588098573 в консоль JS, и вы получите 887190505588098600 обратно.

Клиенты без JS прекрасно справляются с этим. Например, Руби:

jruby-1.7.12 :013 > c["test"]["query"].insert({_id: 887190505588098574, q: 'zzz'})
 => 887190505588098574
jruby-1.7.12 :016 > c["test"]["query"].find({_id: 887190505588098574}).next()
 => {"_id"=>887190505588098574, "q"=>"zzz"}
person Chris Heald    schedule 13.06.2014
comment
Спасибо! Тогда хорошие новости! Я только что столкнулся с некоторыми проблемами с хранением больших целых чисел в mongodb через python, а затем обнаружил проблему, которую описал в своем вопросе. Теперь у меня достаточно информации для работы над этой проблемой. - person Stack Exchange User; 13.06.2014

В MongoDB есть тип NumberLong, который соответствует 64-битному целому (типу BSON< /а> 18)

db.collection.insert({ "_id": new NumberLong(887190505588098573) })

Таким образом, это соответствует $type.

db.collection.find({ "_id": { "$type": 18 } })

Пробег может варьироваться в зависимости от того, где вы можете это использовать, поскольку клиент браузера может получить расширенную форму JSON, но существуют ограничения на то, как его можно использовать без аналогичной оболочки в классе для его обработки.

Работа с большинством других языков должна быть нормальной, так как драйвер приведёт к собственному типу. Так что это действительно зависит от вашей языковой реализации в отношении практичности этого. Но с этим справится сама MongoDB.

person Neil Lunn    schedule 13.06.2014