Я хотел бы хранить в mongdb некоторые очень большие целые числа, в точности (несколько тысяч десятичных цифр). Разумеется, это не будет работать со стандартными типами, поддерживаемыми BSON, и я пытаюсь придумать наиболее изящное обходное решение, учитывая, что я хотел бы выполнять поиск диапазона и подобные вещи. Это требование исключает хранение целых чисел в виде строк, поскольку это делает поиск диапазона нецелесообразным.Как сравнить bson массивы (в mongodb/pymongo)?
Один из способов, который я могу представить, - это кодировать 2^32-расширение с использованием массивов (переменной длины) стандартных ints и добавить к этому массиву первую запись для длины самого массива. Таким образом, лексикографическое упорядочение на этих массивах соответствует обычному упорядочению сколь угодно больших целых чисел.
Например, в коллекции я мог иметь 5 документов
{"name": "me", "fortune": [1,1000]}
{"name": "scrooge mcduck", "fortune": [11,1,0,0,0,0,0,0,0,0,0,0]}
{"name": "bruce wayne","fortune": [2, 10,0]}
{"name": "bill gates", "fortune": [2,1,1000]}
{"name": "francis", "fortune": [0]}
Таким образом, чистая стоимость Брюса Уэйна является 10 * 2^32, Билл Гейтс 2^32 + 1000 и Скрудж Макдак-х 2^320.
Затем я могу сделать что-то вроде, используя { «состояние»: 1} и на моей машине (с PyMongo) он возвращает их в порядке Френсис < < меня банкнота < < брюс Скруджа, как и ожидалось.
Однако, я делаю предположение, что я не видел документированное где-нибудь о том, как BSON массивах сравнения и поиски диапазона, кажется, не работают так, как я думаю, что (например,
find({"fortune":{$gte:[2,5,0]}})
не возвращает никакого документа, но я бы хотел, чтобы у Брюса и scrooge).
Может ли кто-нибудь мне помочь? Спасибо
Оба решения, описанные ниже Дхрувом и Ремоном, требуют, чтобы я знал максимальную длину, и что я храню много нулевых дополнений. – user1199915