Firestore document Устанавливается с помощью mergeFields при создании документа не работает должным образом - PullRequest
1 голос
/ 29 мая 2019

Привет, я сохраняю документ с помощью пакетной записи, например, так:

batch.set(admin.firestore().collection('suuntoAppWorkoutQueue').doc(generateIDFromParts([serviceToken.userName, payload.workoutKey])), <QueueItemInterface>{
          userName: serviceToken.userName,
          workoutID: payload.workoutKey,
          retryCount: 0,
          processed: false, 
        }, {mergeFields: ['retryCount']});

Согласно документации:

Изменяет поведение вызовов set () только на заменить указанные пути к полям.Любой путь поля, который не указан, игнорируется и остается нетронутым.

Выше сказано, что он будет только заменять.

Однако, когда я пишу новый документ, например, ID документа не существует, mergeFields записывает только поле retryCount.

Это задумано?

Тогда не следует говорить:

Изменяет поведение вызовов set () только на write

Вместо:

Изменяет поведение вызовов set () только на replace

1 Ответ

1 голос
/ 16 июня 2019

Я могу следовать вашей аргументации о записи / замене. Я сам не проверял поведение, но если поле записано, если документа не существует, «написать» или «обновить» было бы более подходящим описанием поведения, чем замена, так как в первую очередь ничего не нужно заменять.

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

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 повторно запустит ваш код, чтобы повторить попытку обновления. Это исключает условия гонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...