Firestore中where查询后无法调用update方法?求解决思路
解决Firestore Where查询后无法直接调用Update的问题
这个问题我之前也碰到过,Firestore的Query对象确实没有直接的update方法——因为where查询可能返回多个文档,Firestore为了避免误操作,不让你直接在查询结果上执行更新。不过有几种简单的解决办法,看你的实际需求来选:
1. 当查询只会返回单个文档时(比如Telefono是唯一字段)
如果确定Telefono是用户的唯一标识,查询结果只会有一个文档,你可以先通过get()获取查询快照,再取第一个文档的引用执行更新:
database.collection('UsuariosDev').where('Telefono', '==', textInput.current.value) .get() .then(querySnapshot => { if (!querySnapshot.empty) { // 获取第一个匹配的文档引用 const targetDocRef = querySnapshot.docs[0].ref; // 执行更新操作 return targetDocRef.update({ citas: firebase.firestore.FieldValue.arrayUnion( database.doc('NegociosDev/Peluquerías/Negocios/PR01/citas/' + docRef.id) ) }); } else { console.log("没有找到匹配Telefono的用户文档"); } }) .then(() => { console.log("用户文档更新成功"); }) .catch(error => { console.error("更新失败:", error); });
2. 当查询可能返回多个文档时(批量更新)
如果你的查询可能匹配多个文档,需要批量更新它们,可以用Firestore的批量操作(Batch)来实现:
// 创建批量操作实例 const batch = database.batch(); database.collection('UsuariosDev').where('Telefono', '==', textInput.current.value) .get() .then(querySnapshot => { if (querySnapshot.empty) { console.log("没有找到匹配的文档"); return; } // 遍历所有匹配的文档,添加更新操作到批量中 querySnapshot.docs.forEach(doc => { batch.update(doc.ref, { citas: firebase.firestore.FieldValue.arrayUnion( database.doc('NegociosDev/Peluquerías/Negocios/PR01/citas/' + docRef.id) ) }); }); // 提交批量更新 return batch.commit(); }) .then(() => { console.log("所有匹配文档更新完成"); }) .catch(error => { console.error("批量更新失败:", error); });
优化建议:用Telefono作为文档ID(如果可行)
如果Telefono是用户的唯一标识,其实可以直接把它设为文档ID,这样就不需要where查询了,直接通过文档ID获取引用更新,效率更高:
database.collection('UsuariosDev').doc(textInput.current.value) .update({ citas: firebase.firestore.FieldValue.arrayUnion( database.doc('NegociosDev/Peluquerías/Negocios/PR01/citas/' + docRef.id) ) }) .then(() => console.log("更新成功")) .catch(error => console.error("更新失败:", error));
内容的提问来源于stack exchange,提问作者David Díaz
相关产品推荐
相关产品推荐

