Javascript Cloud Firestore优化了数据库设置,以减少读/写操作
我想知道数据库的设置方式是否会导致过多的递归读取,从而使读取操作的数量成倍增加 我目前有一个用户集合,在每个用户文档中,我有3个其他目录、商品、捆绑包和零件。例如,每个用户都有一个部件列表和一个捆绑包列表 捆绑包目录中的每个文档都有一个映射数组,其中引用了每个映射中零件目录中的一个文档 当我查询捆绑包时,我还想获得捆绑包中每个部分的详细信息。这是否需要我运行另一个onSnapshot 下面是一个例子: 数据库:Javascript Cloud Firestore优化了数据库设置,以减少读/写操作,javascript,firebase,google-cloud-firestore,ionic4,Javascript,Firebase,Google Cloud Firestore,Ionic4,我想知道数据库的设置方式是否会导致过多的递归读取,从而使读取操作的数量成倍增加 我目前有一个用户集合,在每个用户文档中,我有3个其他目录、商品、捆绑包和零件。例如,每个用户都有一个部件列表和一个捆绑包列表 捆绑包目录中的每个文档都有一个映射数组,其中引用了每个映射中零件目录中的一个文档 当我查询捆绑包时,我还想获得捆绑包中每个部分的详细信息。这是否需要我运行另一个onSnapshot 下面是一个例子: 数据库: users (catalog) userID parts
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;
}
我使用的是离子/角度,所以当我返回项目时,它需要是一个对象数组。我在某种程度上重新创建对象,以包含此init中的每个部分。如您所见,对于包返回中的每个部分,我正在进行另一个onSnapshot。这对我来说似乎不正确
我开始意识到,我可能应该给用户打一个电话,然后返回所有信息?但我该如何在那一点上得到子目录呢?我不知道如何在不结帐的情况下继续下去 如果执行嵌套的part.part.onSnapshotpartRef=>{listener,请确保管理这些侦听器。我知道三种常用方法:
一旦外部onSnapshot侦听器消失,嵌套的侦听器可能也应该停止,因为它们的数据可能不再需要了。这是一种相当简单的方法,因为整个包只需要一个侦听器列表
或者,您可以根据外部侦听器中该部件的状态来管理每个部件侦听器,在该部件从捆绑包中消失时删除part1的侦听器。这可以成为一个高效的解决方案,但确实需要一些额外的代码
许多开发人员使用GET进行嵌套文档读取,因为这意味着无需管理任何内容
我只是想得到一个直截了当的答案,即我的数据库设置方式是否会让我在读操作中花费太多。我建议重新编写您的问题,将重点放在读/写操作的数量上,而不是取决于其他因素的成本,以及这一成本是否太高主观性。@FrankvanPuffelen谢谢,我将在这里重新编写。为对其价格计划极其谨慎的客户提供了一个优化查询firestore的简单解决方案。非常简单,请看一看。似乎一个快速的短期解决方案是.get而不是.onSnapshot。我还没有能够进行测试,但从从Firebase到Firestore,我正试图对额外的功能了如指掌。我知道Firestore是一个简单的平面文件,如果我要查询用户,我本来会得到所有的部件、捆绑包等,但没有参考。Firestore不是这样吗?我能不只是查询用户并从中获得t下的所有信息吗hat catalog?读取在Firestore上很浅。它们只读取单个集合中的文档,而不会读取多个集合中的文档—既不是子集合,也不是其他顶级集合。