如何更新Firebase Firestore单个文档?认证后查询更新遇问题
解决Firestore用where查询后更新文档的问题
嘿,我懂你碰到的这个问题了——用where查询完直接想调用update肯定会报错,因为你拿到的不是单个文档对象,而是QuerySnapshot(查询快照),它本身并没有update方法,官方示例里直接用update的场景,都是已经拿到单个DocumentReference或DocumentSnapshot的情况。
既然你的uid应该是唯一的(每个用户对应一个文档),可以按下面的步骤来解决:
- 先执行查询获取查询快照
- 检查快照里是否有匹配的文档(避免空数据报错)
- 取出第一个匹配的文档(因为
uid唯一,只会有一个) - 调用文档的
ref.update()方法来更新属性
给你写个完整的示例代码:
firebase.firestore().collection("users") .where("uid", "==", payload.uid) .get() .then((querySnapshot) => { // 检查是否存在匹配的文档 if (!querySnapshot.empty) { // 取出第一个匹配的文档(uid唯一,所以只会有一个) const targetDoc = querySnapshot.docs[0]; // 通过文档引用调用update方法更新字段 targetDoc.ref.update({ // 这里填入你要更新的字段,比如Auth数据和自定义属性 displayName: payload.displayName, email: payload.email, lastActive: new Date(), customPreference: "自定义属性值" }) .then(() => { console.log("用户文档更新成功!"); }) .catch((err) => { console.error("更新文档出错:", err); }); } else { console.log("未找到匹配该uid的用户文档"); // 这里可以考虑如果没找到文档,是否要创建新文档 // firebase.firestore().collection("users").add({ uid: payload.uid, ...其他字段 }) } }) .catch((err) => { console.error("查询用户文档出错:", err); });
另外补充个更高效的小技巧:如果你的场景是用户登录后更新自己的文档,其实完全没必要用where查询——直接把payload.uid作为文档ID来获取文档引用就行,代码会更简洁,还能省掉查询的额外开销:
firebase.firestore().collection("users").doc(payload.uid) .update({ displayName: payload.displayName, email: payload.email, lastActive: new Date() }) .then(() => { console.log("文档更新成功"); }) .catch((err) => { console.error("更新失败:", err); });
内容的提问来源于stack exchange,提问作者Jim Jones
相关产品推荐
相关产品推荐

