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”更新为参数中的值。仅此而已。因此我问了这样一个问题,在本质上相同的操作中,会出现不同的行为。