Javascript firestore transaction.set(ref,data,{merge:true})和transaction.update(ref,data)之间有什么区别?

Javascript firestore transaction.set(ref,data,{merge:true})和transaction.update(ref,data)之间有什么区别?,javascript,firebase,google-cloud-firestore,transactions,Javascript,Firebase,Google Cloud Firestore,Transactions,我所面临的一个事实是,在功能上似乎相同的操作会导致不同的结果 在transaction.set(ref,data,{merge:true})的情况下,仅从第二次执行操作获得结果,并且立即执行transaction.update(ref,data) 在这两种情况下,所有环境和输入数据都是相同的。也许在运行时会有所不同 async updateFields(userId: string, storyId: string, allItemsSeen: boolean,

我所面临的一个事实是,在功能上似乎相同的操作会导致不同的结果

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
        } 
    });
}
异步更新字段(userId:string、storyId:string、allitemssen:boolean、, lastId?:字符串| null):承诺{ 等待此.db.runTransaction(异步(事务)=>{ const queryRef=this.refs.story(userId,storyId); const query=wait transaction.get(queryRef); 常量数据:any={[所有项]:allitemssen}; 如果(lastItemSeenId!==未定义){ 数据[LAST_ITEM_SEEN_ID]=lastItemSeenId; } 如果(!query.empty){ transaction.update(query.docs[0].ref,data);//立即执行。 ========================================== transaction.set(query.docs[0].ref,data,{merge:true});//仅从第二次执行操作时获得结果 } }); }
调用
update
只会在文档已经存在时更新文档。如果文档尚不存在,
update
调用将失败

另一方面,
set
调用将根据需要创建或更新文档


同样的区别也适用于事务和常规写入操作。

如果文档已经存在,
update
调用只会更新文档。如果文档尚不存在,
update
调用将失败

另一方面,
set
调用将根据需要创建或更新文档


这一区别同样适用于事务和常规写入操作。

但这并不能解释这两个操作产生不同结果的原因。您可能希望读取,因为很难说您目前共享的代码段存在什么问题。但这并不能解释为什么这两个操作会产生不同的结果。您可能需要阅读,因为很难说您目前共享的代码段存在什么问题。您所指的“结果”是什么?如果您编辑问题以显示对您没有意义的代码和结果,这会有所帮助。结果是将数据库中的字段“allItemsSeen”更新为参数中的值。仅此而已。因此我问了这样一个问题,在本质上相同的操作中,会发生不同的行为。你所指的“结果”是什么?如果您编辑问题以显示对您没有意义的代码和结果,这会有所帮助。结果是将数据库中的字段“allItemsSeen”更新为参数中的值。仅此而已。因此我问了这样一个问题,在本质上相同的操作中,会出现不同的行为。