Firestore嵌套数据读写问题求助
解决Firestore父文档ID斜体、无法查询的问题
嘿,我来帮你搞清楚这个Firestore的小坑~
首先,你遇到的斜体ID问题,核心原因是:你生成的quotes文档根本没被实际创建。
看你执行的代码:
db.collection('quotes').doc().collection('productsOrdered').add({...})
这里的doc()不带参数时,Firestore只会生成一个新的文档引用,但不会自动创建这个文档——只有当你给这个引用写入数据(比如用set()或update())时,文档才会真正存在于数据库中。你现在只是直接在这个引用下创建了子集合productsOrdered的文档,父文档quotes里没有任何数据,所以控制台会用斜体显示它的ID,表示这个文档实体不存在,但因为它有子集合,所以控制台会展示这个引用路径。
这也是为什么你用这个ID查询quotes文档时找不到数据——因为它本来就没被创建出来呀!
解决方案
有两种方式可以解决这个问题:
给父文档写入必要数据
先创建quotes文档并写入字段,再添加子集合数据:// 生成quotes文档引用 const quoteDocRef = db.collection('quotes').doc(); // 写入父文档数据(可以是业务需要的字段,比如创建时间、用户标识等) await quoteDocRef.set({ createdAt: new Date(), customerId: 'your-customer-id' }); // 再添加子集合的产品数据 await quoteDocRef.collection('productsOrdered').add({ productName: '示例产品', quantity: 2, price: 99.99 });这样操作后,
quotes文档就会实际存在,控制台里的ID也会变成非斜体,用ID查询就能拿到数据了。写入空对象确保父文档存在
如果你的业务场景中quotes文档不需要任何业务字段,只是作为子集合的容器,那可以写入一个空对象来让文档实体存在:const quoteDocRef = db.collection('quotes').doc(); // 写入空对象,触发文档创建 await quoteDocRef.set({}); // 继续添加子集合数据 await quoteDocRef.collection('productsOrdered').add({...});
另外补充一下:你之前以为斜体是集合被删除,其实不是哦~斜体ID表示的是文档不存在,但存在子集合或被引用过,和集合删除是两回事。
内容的提问来源于stack exchange,提问作者user1203605
相关产品推荐
相关产品推荐

