Cloud Firestore оптимизировал настройку базы данных для минимальных операций чтения / записи - PullRequest
0 голосов
/ 24 февраля 2019

Я должен получить ответ о том, вызовет ли установка моей базы данных слишком много рекурсивных чтений и, следовательно, экспоненциально увеличит количество операций чтения.

В настоящее время у меня есть коллекция пользователей,Внутри каждого пользовательского документа у меня есть 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.Это кажется мне неправильным.

Что-то, что меня осенило, это то, что я, вероятно, должен сделать один звонок пользователю, который, в свою очередь, возвращает все?Но как мне получить подкаталоги в этот момент?Я не уверен, как поступить, не выставляя счет!

1 Ответ

0 голосов
/ 24 февраля 2019

Если вы используете вложенный part.part.onSnapshot(partRef => { слушатель, обязательно управляйте этими слушателями.Мне известны три общих подхода:

  1. Как только ваш внешний onSnapshot слушатель исчезнет, ​​вложенные из них, вероятно, также должны быть остановлены (поскольку их данные, вероятно, больше не нужны).Это довольно простой подход, так как вам нужен только один список слушателей для всего пакета

  2. В качестве альтернативы вы можете управлять каждым слушателем "части" на основе состояния этой части во внешнемслушатель, удаляя слушателя для "part1", когда это исчезает из пакета.Это может быть превращено в высокоэффективное решение, но требует (довольно некоторого) дополнительного кода.

  3. Многие разработчики используют get() s для чтения вложенных документов, поскольку это означает, что естьничего не поделаешь.

...