Какая разница между firestore транзакции.set (ref, data, {merge: true}) и транзакции.update (ссылка, данные)?

Я столкнулся с тем, что операции, которые кажутся одинаковыми по функциональности, приводят к разным результатам.

В случае transaction.set(ref, data, {merge: true}) результат получается только при втором выполнении операции, а transaction.update(ref, data) выполняется немедленно.

Все окружение и входные данные одинаковы в обоих случаях. Может быть, есть разница во времени выполнения?

async updateFields(userId: string, storyId: string, allItemsSeen: boolean,
                       lastId?: string | null): Promise<void> {

    await this.db.runTransaction(async (transaction) => {
        const queryRef = this.refs.story(userId, storyId);
        const query = await transaction.get(queryRef);

        const data: any = {[ALL_ITEMS_SEEN]: allItemsSeen};

        if (lastItemSeenId !== undefined) {
            data[LAST_ITEM_SEEN_ID] = lastItemSeenId;
        }

        if (!query.empty) {
            transaction.update(query.docs[0].ref, data); // is performed immediately.
==========================================
            transaction.set(query.docs[0].ref, data, {merge: true}); // the result is obtained only from the second execution of the operation
        } 
    });
}

Всего 1 ответ


Вызов обновления обновит документ, только если он уже существует. Если документ еще не существует, вызов update завершится ошибкой.

С другой стороны, set вызов создаст или обновит документ по мере необходимости.

Это же различие применяется как в транзакциях, так и в обычных операциях записи.


Есть идеи?

10000