Cloud Firestore优化的数据库设置,以最小化读/写操作

时间:2019-02-24 14:58:04

标签: javascript firebase google-cloud-firestore ionic4

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

我目前有一个用户集合,在每个用户文档中,我还有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。对我来说这似乎不正确。

即将发生的事情是我可能应该对用户进行一次呼叫,这反过来会返回所有内容?但是,此时我如何获得子目录?我不确定如何不增加帐单!

1 个答案:

答案 0 :(得分:1)

如果您使用嵌套的break侦听器,请确保管理这些侦听器。我知道三种常见的方法:

  1. 一旦您的外部part.part.onSnapshot(partRef => {侦听器消失了,嵌套的侦听器也应该被停止(因为不再需要它们的数据)。这是一种非常简单的方法,因为您只需要整个捆绑包的一个侦听器列表

  2. 或者,您可以根据外部侦听器中该部件的状态来管理每个“部件”侦听器,并在捆绑软件中消失后删除“ part1”的侦听器。可以将其制成高效解决方案,但确实(需要一些)额外的代码。

  3. 许多开发人员使用onSnapshot来嵌套文档读取,因为这意味着无需管理。