Если вы посмотрите на документацию API для Timestamp (я связался с серверной версией nodejs SDK, которая используется nodejs Firebase Admin SDK), вы увидите, что она имеет более высокая степень детализации, чем у JavaScript объекта Date . Отметка времени записывает время с точностью наносекунда , в то время как Date просто использует точность миллисекунда . Вот как Firestore внутренне представляет свои метки времени, и точность передается клиентам с этим новым типом данных , который не теряет данных .
Почему это важно? Что ж, если у вас есть много документов, поступающих в коллекцию с течением времени, шансы получить действительно уникальный номер метки времени go увеличатся, если время будет более детальным. Кроме того, если Firestore использует точность наносекунды, вам может потребоваться подобрать эту точность, когда вы делаете такие вещи, как разбиение на страницы, которые требуют, чтобы вы знали значение отсортированного поля в последнем элементе страницы. Если вы не укажете правильное значение, ваша подкачка может быть неточной.
FieldValue.serverTimestamp()
важно, в частности, потому что она использует тактовое значение, которое гарантировано точно по стандартам Google самостоятельно сервера. При этом используется очень сложный способ работы с проблемными c метками времени , в частности, работы с високосными секундами. Если клиент пытается добавить значение со своим собственным чувством времени, кто знает, является ли это значение часов клиента точным. Это может быть дико неточно, и, возможно, разработчик этого не хочет. Использование serverTimestamp()
говорит Google, что он должен использовать свое собственное чувство времени, чтобы быть точным, когда клиент может не быть.
Вы можете go еще больше с этим, используя правила безопасности который может проверить, чтобы убедиться, что веб-клиент или мобильный клиент предоставили значение токена serverTimestamp()
в значении поля, где оно должно быть необходимо, поэтому он не может подделать временную метку, где требуется только истинная текущая временная метка. Язык правил безопасности позволяет вам использовать request.time для сравнения со значением поля, чтобы убедиться, что запросы, основанные на времени, обрабатываются правильно.
Могут быть и другие способы, позволяющие сделать разницу в точности разница, но суть в том, что клиентские SDK должны соответствовать тому, что служба использует внутри.