Я могу следовать вашей аргументации о записи / замене. Я сам не проверял поведение, но если поле записано, если документа не существует, «написать» или «обновить» было бы более подходящим описанием поведения, чем замена, так как в первую очередь ничего не нужно заменять.
Если вы хотите обновить поле, только если документ уже существует, вы можете использовать транзакцию для этого. Вы можете использовать транзакцию, чтобы получить последнюю версию документа, проверить, существует ли она, и, если да, обновить ее.
let data = {
userName: serviceToken.userName,
workoutID: payload.workoutKey,
retryCount: 0,
processed: false,
}
let db = admin.firestore()
let documentReference = db.collection('suuntoAppWorkoutQueue').doc(...)
db.runTransaction((transaction) =>
transaction.get(documentRef).then((doc) => {
if (doc.exists) {
return t.update(documentRef, {retryCount: data.retryCount});
} else {
return t.set(documentRef, data);
}
}
).then(...).catch(...)
Транзакции также имеют преимущество быть атомарными. Если значение на сервере изменилось с момента его получения, транзакция завершится неудачно. В этом случае Firestore повторно запустит ваш код, чтобы повторить попытку обновления. Это исключает условия гонки.