React中使用Firestore向子集合写入数据失败的问题求助
React中使用Firestore向子集合写入数据失败的问题求助
嘿,我完全懂你遇到的困扰!你之前能正常往Firestore的France集合写数据,但想直接往France的子集合chapterOne写数据时却失败了,对吧?这其实是因为你没搞清楚Firestore的层级结构规则,我来给你捋清楚。
首先得明确:Firestore的存储结构是集合 → 文档 → 子集合 → 子文档这样的层级循环,子集合必须依附于具体的父文档,而不能直接挂在集合下面。你之前写的collection(fireStoreDB, 'France/chapterOne')并不会被解析成France集合下的子集合,反而会被当成一个名字叫France/chapterOne的顶级集合——Firestore允许集合名称带斜杠,但这不是你想要的层级关系。
那该怎么改代码呢?分两种情况给你说:
情况1:你已经有France集合里的目标父文档
比如你已经在France集合里创建了一个文档(假设它的ID是targetDocId),那你可以这样创建子集合的引用:
// 方法1:拆分路径参数传递(更清晰) const subCollectionRef = collection(fireStoreDB, 'France', 'targetDocId', 'chapterOne'); // 方法2:先获取父文档引用,再生成子集合引用 const parentDocRef = doc(fireStoreDB, 'France', 'targetDocId'); const subCollectionRef = collection(parentDocRef, 'chapterOne');
然后再用addDoc写入数据:
const newRcd = await addDoc(subCollectionRef, { sentence: 'To be or not to be ...', order: 97 });
情况2:你还没有对应的父文档
如果你还没在France集合里创建父文档,可以先创建这个文档,再生成子集合:
// 先创建France集合里的父文档(这里用addDoc自动生成ID,也可以用setDoc指定ID) const parentDocRef = await addDoc(collection(fireStoreDB, 'France'), { // 这里可以放父文档的字段,比如chapter: 'chapterOne',空对象也能创建文档 }); // 基于父文档引用创建子集合 const subCollectionRef = collection(parentDocRef, 'chapterOne'); // 写入子集合数据 const newRcd = await addDoc(subCollectionRef, { sentence: 'To be or not to be ...', order: 97 });
另外还要提醒你:别忘了检查Firestore的安全规则,确保你有这个子集合的写入权限,否则即使代码正确,数据也写不进去。
我之前刚用Firestore的时候也踩过这个坑,一开始误以为子集合能直接挂在集合下面,后来才搞懂必须依附具体文档,现在把这个经验分享给你,应该能解决你的问题!
内容来源于stack exchange
相关产品推荐
相关产品推荐

