Firebase Firestore:认证后查询更新用户文档遇update方法不存在问题求助
Great question! The "update method doesn't exist" error pops up because when you use a where clause, you're dealing with a Query and then a QuerySnapshot—neither of these objects have an update method built-in, since a query could potentially match multiple documents. Let's walk through two solutions, including a more efficient approach that's actually the recommended practice for user documents.
方法1:通过Where查询后更新单个文档
Since your /users collection should have one document per authenticated user, you can run the query, check for matching documents, then grab the first one's reference to update it. Here's a JavaScript example:
// 获取当前已认证的用户 const currentUser = firebase.auth().currentUser; if (currentUser) { // 查询users集合中uid与当前用户匹配的文档 firebase.firestore().collection('users') .where('uid', '==', currentUser.uid) .get() .then(querySnapshot => { if (!querySnapshot.empty) { // 取第一个匹配的文档(用户文档应该唯一) const userDocRef = querySnapshot.docs[0].ref; // 更新文档,合并现有数据和新属性 return userDocRef.update({ displayName: currentUser.displayName, email: currentUser.email, // 自定义用户属性 lastActive: firebase.firestore.FieldValue.serverTimestamp() }); } else { // 如果没有找到文档,创建一个新的 return firebase.firestore().collection('users').add({ uid: currentUser.uid, displayName: currentUser.displayName, email: currentUser.email, lastActive: firebase.firestore.FieldValue.serverTimestamp() }); } }) .then(() => { console.log('用户文档更新/创建成功!'); }) .catch(error => { console.error('操作失败:', error); }); }
方法2:直接用用户UID作为文档ID(推荐)
This is the smarter approach because every authenticated user has a unique uid—you can use this as the document ID directly, eliminating the need for a where query entirely. It's faster (one less database call) and avoids any edge cases where multiple documents might match the query.
const currentUser = firebase.auth().currentUser; if (currentUser) { // 直接通过UID获取文档引用 const userDocRef = firebase.firestore().collection('users').doc(currentUser.uid); // 使用set方法并设置merge: true,既可以更新现有文档,也能创建新文档 userDocRef.set({ displayName: currentUser.displayName, email: currentUser.email, lastActive: firebase.firestore.FieldValue.serverTimestamp(), // 自定义属性 favoriteTheme: 'dark' }, { merge: true }) .then(() => { console.log('用户文档更新/创建成功!'); }) .catch(error => { console.error('操作失败:', error); }); }
关键提醒:安全规则
Don't forget to set up Firestore security rules to ensure users can only modify their own documents:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, update, delete: if request.auth != null && request.auth.uid == userId; allow create: if request.auth != null; } } }
内容的提问来源于stack exchange,提问作者belladaisy2018

