Почему Firestore округляет 64-битные целые числа?

#google-cloud-firestore

#python #google-облако-firestore #целое число

Вопрос:

Я пытаюсь сохранить 64-битные целые числа из программы Python в своей базе данных Firestore. Проблема в том, что кажется, что последние цифры округлены.

 doc = db.collection('questions').document('0MPvbeTEglD9lbpDq6xm')
ints = [9223372036854775807, 9223372036854775533, 9223372036854775267]
doc.update({
    'random': ints
})
  

Когда я просматриваю базу данных, они сохраняются как:

random = [9223372036854776000, 9223372036854776000, 9223372036854775000}

Согласно документации поддерживаются 64-разрядные целые числа со знаком. В чем может быть проблема?

Комментарии:

1. Цифры округлены или просто усечены?

2. Как мне это понять?

3. Усечение означает, что цифры являются «обрезанными». Например, если у вас есть 0.1234567, и число усекается после 4-й цифры, тогда оно становится 0.1234 без обязательного округления числа, тогда как округление само по себе означает, что оно становится, например, 0.123457 или просто 0, если вы округляете до ближайшего целого числа.

Ответ №1:

Я не уверен на 100%, но я предполагаю, что то, что вы видите, связано с тем, что целые числа JavaScript не имеют размера 64 бита. На самом деле они больше похожи на 53 бита. Поскольку Firebase console — это веб-приложение, реализованное с помощью JavaScript, оно, вероятно, не может понять полные 64 бита очень больших целых чисел, которые вы записываете в него.

Я бы рекомендовал считывать значения обратно из вашего документа с помощью другой программы на python вместо проверки значений в консоли. Если они совпадают с тем, что вы написали, то здесь нет реальной проблемы. Вы просто не можете доверять отображению значений в консоли.

Комментарии:

1. Вот и все, они вернулись правильно представленными, когда я извлек их с помощью программы на Python.

2. К сожалению, это не просто читаемость. У нас есть облачная функция, которая добавляет новые данные firestore в электронную таблицу Google с помощью триггера onWrite, а длинные значения в документах записываются в 53-битном представлении.

3. Это кажется неприемлемым упрощением в API Firestore Javascript… Он может вводить пользовательский целочисленный тип, как это делается для Timestamp, возможно, с настраиваемой опцией для его включения, что угодно. API базы данных, теряющий данные, недопустим.

4. @cubuspl42 Вы всегда можете подать запрос на функцию. support.google.com/firebase/contact/support