如何在成功获取Firestore文档后获取其自动生成的文档ID
解决Firestore查询后获取文档ID的问题
你遇到的这个问题其实挺常见的——data()方法只会返回文档里自定义的字段数据,Firestore自动生成的文档ID和路径并不包含在这个返回对象里,它们是直接挂载在DocumentSnapshot(文档快照)对象本身的属性。
正确的获取方式
你需要从ref.docs[0]这个快照对象上直接读取id和path,而不是从data()返回的结果里拿:
const ref = await db.collection('users').where('phone', '==', phone) .where('password', '==', password).get(); // 先判断是否有匹配的文档,避免数组越界报错 if (!ref.empty) { // 获取第一个匹配的文档快照对象 const userDoc = ref.docs[0]; // 从快照对象直接取ID和路径 const docId = userDoc.id; const docPath = userDoc.ref.path; // 获取文档的自定义字段数据 const userData = userDoc.data(); // 可以把ID和数据合并成一个对象使用 const fullUserData = { id: docId, path: docPath, ...userData }; console.log(fullUserData); } else { console.log("未找到匹配的用户信息"); }
为什么之前的方法无效?
userDoc.data():仅返回你在Firestore后台手动设置的字段(比如phone、password),不会包含Firestore自动维护的元数据(ID、路径、创建时间等)。userDoc.id:直接从文档快照对象获取该文档的唯一ID字符串。userDoc.ref.path:获取文档在Firestore里的完整路径(格式类似users/xxxxxxxxx)。
额外加个ref.empty的判断也很必要,能避免查询不到文档时ref.docs[0]触发数组越界的错误,让代码更健壮~
内容的提问来源于stack exchange,提问作者Sony
相关产品推荐
相关产品推荐

