Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Cloud Firestore优化了数据库设置,以减少读/写操作_Javascript_Firebase_Google Cloud Firestore_Ionic4 - Fatal编程技术网

Javascript Cloud Firestore优化了数据库设置,以减少读/写操作

Javascript Cloud Firestore优化了数据库设置,以减少读/写操作,javascript,firebase,google-cloud-firestore,ionic4,Javascript,Firebase,Google Cloud Firestore,Ionic4,我想知道数据库的设置方式是否会导致过多的递归读取,从而使读取操作的数量成倍增加 我目前有一个用户集合,在每个用户文档中,我有3个其他目录、商品、捆绑包和零件。例如,每个用户都有一个部件列表和一个捆绑包列表 捆绑包目录中的每个文档都有一个映射数组,其中引用了每个映射中零件目录中的一个文档 当我查询捆绑包时,我还想获得捆绑包中每个部分的详细信息。这是否需要我运行另一个onSnapshot 下面是一个例子: 数据库: users (catalog) userID parts

我想知道数据库的设置方式是否会导致过多的递归读取,从而使读取操作的数量成倍增加

我目前有一个用户集合,在每个用户文档中,我有3个其他目录、商品、捆绑包和零件。例如,每个用户都有一个部件列表和一个捆绑包列表

捆绑包目录中的每个文档都有一个映射数组,其中引用了每个映射中零件目录中的一个文档

当我查询捆绑包时,我还想获得捆绑包中每个部分的详细信息。这是否需要我运行另一个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;
  }
我使用的是离子/角度,所以当我返回项目时,它需要是一个对象数组。我在某种程度上重新创建对象,以包含此init中的每个部分。如您所见,对于包返回中的每个部分,我正在进行另一个onSnapshot。这对我来说似乎不正确

我开始意识到,我可能应该给用户打一个电话,然后返回所有信息?但我该如何在那一点上得到子目录呢?我不知道如何在不结帐的情况下继续下去

如果执行嵌套的part.part.onSnapshotpartRef=>{listener,请确保管理这些侦听器。我知道三种常用方法:

一旦外部onSnapshot侦听器消失,嵌套的侦听器可能也应该停止,因为它们的数据可能不再需要了。这是一种相当简单的方法,因为整个包只需要一个侦听器列表

或者,您可以根据外部侦听器中该部件的状态来管理每个部件侦听器,在该部件从捆绑包中消失时删除part1的侦听器。这可以成为一个高效的解决方案,但确实需要一些额外的代码

许多开发人员使用GET进行嵌套文档读取,因为这意味着无需管理任何内容


我只是想得到一个直截了当的答案,即我的数据库设置方式是否会让我在读操作中花费太多。我建议重新编写您的问题,将重点放在读/写操作的数量上,而不是取决于其他因素的成本,以及这一成本是否太高主观性。@FrankvanPuffelen谢谢,我将在这里重新编写。为对其价格计划极其谨慎的客户提供了一个优化查询firestore的简单解决方案。非常简单,请看一看。似乎一个快速的短期解决方案是.get而不是.onSnapshot。我还没有能够进行测试,但从从Firebase到Firestore,我正试图对额外的功能了如指掌。我知道Firestore是一个简单的平面文件,如果我要查询用户,我本来会得到所有的部件、捆绑包等,但没有参考。Firestore不是这样吗?我能不只是查询用户并从中获得t下的所有信息吗hat catalog?读取在Firestore上很浅。它们只读取单个集合中的文档,而不会读取多个集合中的文档—既不是子集合,也不是其他顶级集合。