# #javascript #node.js #firebase #google-cloud-firestore
Вопрос:
Я новичок в Firestore, разрабатываю приложение, использующее NodeJS
и Firestore в качестве базы данных для извлечения и обновления данных.
Пример структуры Firestore приведен ниже:
CollectionA:
name: "name"
id: "id"
status: "status"
Предположим, status
что поле может принимать одно из приведенных ниже строковых значений.
начало, in_progress, ожидание, конец.
Поля name
и id
обновляются один раз при создании, и поле status
может обновляться несколько раз (в миллисекундах).
Я хотел бы понять следующие пункты:
- Делает ли приведенный ниже фрагмент обновления, удостоверяется, что данные записаны в серверную часть, а затем переходит к следующей строке инструкции. Или обновляются только метаданные, которые еще предстоит записать в бэкенд БД?
await docRef.update({
status: "in_progress",
});
- Существует ли какое-либо ограничение по времени для обновления определенного поля в документе? Означает, что количество записей в определенное поле может быть выполнено за 1 секунду?
Примечание: Я не смог бы использовать пакетную фиксацию, так как я использую это status
поле в качестве управляющего сигнала для вызова определенных блоков кода.
Спасибо вам за вашу помощь.
Ответ №1:
Как update
говорится в документации, он возвращает:
Обещание [которое] будет выполнено, как только данные будут успешно записаны в серверную часть
Поскольку вы используете await
, заявление завершится, как только обещание от update
вызова будет выполнено.
Поэтому, если вы обернете его в обработчик исключений:
try {
await docRef.update({
status: "in_progress",
});
// 👈 If you get here, the write completed on the server
}
catch (error) {
// 👈 If you get here, the write failed
console.error(error);
}
Все ограничения задокументированы здесь. Наиболее актуальным, по-видимому, является этот мягкий предел:
Максимальная постоянная скорость записи в документ
1 в секунду
Поддержание скорости записи выше одного раза в секунду увеличивает задержку и приводит к ошибкам, связанным с конфликтом. Это не жесткий предел, и вы можете превзойти его короткими очередями.
Как это объясняется, вы можете превышать лимит в течение коротких периодов времени, что, по-видимому, является вашим вариантом использования.
Комментарии:
1. Привет, Фрэнк, спасибо за подробное объяснение. Последующий запрос, поскольку я обновляю конкретное поле документа с более высокой скоростью (в миллисекундах), выдаст ли он ошибку, если какие-либо обновления / записи завершатся неудачно в течение этого короткого периода? Или это проходит незамеченным?
2. Как сказано в документации, 1 запись на документ в секунду является мягким ограничением и может быть превышена короткими очередями. Как сказано в моем ответе, это, похоже, соответствует вашему варианту использования. Но если вы превысите это ограничение для одного документа в течение более длительных периодов времени, вы можете увидеть разногласия в этих записях.
3. Ценю вашу помощь. Это действительно полезно. Да, как вы упомянули в моем случае, записи не должны завершаться неудачей, так как я пишу максимум 4 записи, но короткими очередями.
4. Я просмотрел документы. «может быть превышено короткими очередями», есть ли для этого количественная оценка?
5. Нет. Как уже было сказано, это мягкое ограничение; это не то, что было закодировано в системе, а следствие необходимости репликации данных в нескольких центрах обработки данных, прежде чем подтвердить обратную запись клиенту.