【发布时间】:2019-07-18 02:04:07
【问题描述】:
我要回答我的数据库设置方式是否会导致递归读取过多,从而成倍增加读取操作的数量。
我目前有一个用户集合,在每个用户文档中,我还有 3 个其他目录,goods、bundles 和 parts。例如,每个用户都有一个零件列表和一个捆绑列表。
bundles 目录中的每个文档都有一个映射数组,其中引用了每个映射中 parts 目录中的文档。
当我查询捆绑包时,我还想获取捆绑包中每个部分的详细信息。这是否需要我运行另一个onSnapshot?
这是一个例子:
数据库:
users (catalog)
userID
parts
partID1
partID2
partID3
bundles
bundleID1
title: "string",
parts: [
part:"/users/userID/parts/partID1,
qty: 1
]
parts: [
part:"/users/userID/parts/partID2,
qty: 1
]
parts: [
part:"/users/userID/parts/partID3,
qty: 1
]
获取捆绑包
initBundle(bid) {
const path = this.database.collection('users').doc('userID').collection('bundles').doc(bid);
path.ref.onSnapshot(bundle => {
const partsArr = [];
bundle.data().parts.forEach(part => {
part.part.onSnapshot(partRef => {
const partObj = {
data: partRef.data(),
qty: part.qty
};
partsArr.push(partObj);
});
});
const bundleObj = {
title: bundle.data().title,
parts: partsArr
};
this.bundle.next(bundleObj);
});
return this.bundle;
}
我为此使用 Ionic/Angular,所以当我返回项目时,它需要是一个对象数组。我正在重新创建对象以包含此init 上的每个部分。如您所见,对于捆绑包中的每个部分返回,我正在做另一个onSnapshot。这对我来说似乎不正确。
让我恍然大悟的是,我可能应该对用户进行一次调用,然后返回所有内容?但是那时我如何获得子目录?我不知道如何在不支付账单的情况下继续进行!
【问题讨论】:
-
“我只是想直接回答我的数据库设置方式是否会在读取操作上花费太多。”我建议重写您的问题,以关注您将被收取的读/写操作的数量,而不是成本(这也取决于其他因素),以及这个成本是否太多(这是主观的)。跨度>
-
@FrankvanPuffelen 谢谢,我会在这里重新写。
-
为对价格计划极为谨慎的客户提出了一个简单的解决方案,用于优化对 Firestore 的查询。 The implementation 很简单,看看吧。
标签: javascript firebase google-cloud-firestore ionic4