我将就数据库的设置方式是否会导致过多的递归读取并因此以指数方式增加读取操作的数量获得答案。

我目前有一个用户集合,在每个用户文档中,我还有其他3个目录,分别为goodsbundlesparts。例如,每个用户都有一个零件列表和一个捆绑包列表。

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。对我来说这似乎不正确。

我突然想到的是,我可能应该对用户进行一次呼叫,这又会返回所有内容?但是,此时我如何获得子目录?我不确定如何在不增加账单的情况下继续!

最佳答案

如果您使用嵌套的part.part.onSnapshot(partRef => {侦听器,请确保管理这些侦听器。我知道三种常见的方法:


一旦您的外部onSnapshot侦听器消失了,嵌套的侦听器也应该被停止(因为不再需要它们的数据)。这是一种非常简单的方法,因为您只需要整个捆绑包的一个侦听器列表
或者,您可以根据外部侦听器中该部分的状态来管理每个“部分”侦听器,并在捆绑包中消失后删除“ part1”的侦听器。可以将其制成高效解决方案,但确实(需要一些)额外的代码。
许多开发人员将get()用于嵌套的文档读取,因为这意味着没有什么可管理的。

09-29 23:12