React+Firebase创建文档后存ID至字段并跳转查询的方案是否可行?
问题解答
核心结论
把docRef.id存入objectId字段的方案是可行的,但并非必要——Firebase Firestore的文档本身自带唯一ID(即docRef.id),直接用这个ID就能完成后续的跳转和详情查询。不过如果你的业务逻辑明确需要将ID存储为文档内的一个字段,这么做完全没问题。
优化你的创建代码
你当前的写法没法在创建文档时直接写入objectId,因为addDoc是Firebase自动生成ID后才创建文档的。有两种方式实现你的需求:
方式1:先手动生成文档ID,再创建文档
这种方式可以在创建时直接把ID写入objectId字段,不需要后续更新:
<form onSubmit={(e) => { e.preventDefault() onAuthStateChanged(auth, (user) => { if(user) { // 先手动生成文档ID const docId = doc(collection(db, "objects")).id; setDoc(doc(db, "objects", docId), { name: "my object", description: "a nice object", owner: user.uid, objectId: docId // 直接写入ID }).then(() => { // 后续逻辑 }) } }) }}>
方式2:创建文档后更新字段
沿用你原来的addDoc,创建完成后用updateDoc把ID写入:
<form onSubmit={(e) => { e.preventDefault() onAuthStateChanged(auth, (user) => { if(user) { addDoc(collection(db, "objects"), { name: "my object", description: "a nice object", owner: user.uid }).then((docRef) => { // 更新文档,写入objectId updateDoc(docRef, { objectId: docRef.id }) }) } }) }}>
详情页查询的优化
如果你的详情页路径是/object/:id,不管你存不存objectId字段,都可以直接用路径里的ID直接获取文档,比用where查询更高效:
// 替代原来的query写法 const docRef = doc(db, "objects", x); // x是路径里的id const docSnap = await getDoc(docRef); if (docSnap.exists()) { const objectData = docSnap.data(); }
这种方式直接定位到单个文档,不需要遍历集合做查询,性能更好。
内容的提问来源于stack exchange,提问作者jeansvf
相关产品推荐
相关产品推荐

