Firestore получить все документы и подколлекции корневой коллекции

Скажем, у меня такая структура

    A (collection): { 
       a (doc): {
           name:'Tim',
           B (collection):{
               b (doc): {
                      color:'blue'
               }
             }
          }
    }

где A и B являются коллекциями, а A и B являются документами.
Есть ли способ получить все, что содержится в корневом документе, с одним запросом?
Если я запрошу подобное

db.collection("A").doc("a").get()

Я просто получаю поле name:'Tim'. Я хочу также получить все B-документы.
В основном я хочу, чтобы мой запрос возвращался

         {
           user:'Tim',
           B (collection):{
               b (doc): {
                      color:'blue'
               }
             }
          }

Возможно, мне действительно нужно сделать несколько запросов по одному для каждой коллекции:/?

Скажем, у меня есть действительно глубокое вложенное дерево коллекций, представляющее профиль пользователя, мои расходы будут расти как ад, так как каждый раз, когда я загружаю пользовательский профиль, у меня есть множитель запросов на чтение 1 x N где N - глубина моего дерева.:/

Ответ 1

Как мы знаем, запрос в Cloud Firestore по умолчанию невелик. Этот тип запроса не поддерживается, хотя это то, что Google может рассмотреть в будущем.

Ответ 2

Если вы беспокоитесь о расходах на каждое притяжение, вам нужно будет структурировать свои данные в соответствии с вашими потребностями общего вида/тянуть, а не тем, что вы можете предпочесть для идеальной структуры. Если вам нужно каждый раз тянуть эти вещи, Рассмотрите возможность использования "карт" для вещей, которые фактически не должны быть подкатегориями с документами.

В этом примере "предпочтения" - это карта.

{
  user: "Tim",
  preferences: {
      color: "blue",
      nickname: "Timster"
  }
}

Каждый документ также ограничен размером 1 МБ, поэтому, если вам нужно что-то сохранить для этого пользователя, который будет масштабироваться и продолжать расти, например, записи журнала, тогда было бы разумно разбить журналы на подсерию, которая только вытягивается, когда вы этого хотите, делая каждую запись в журнале отдельным документом... И все ли журналы для всех пользователей хранятся в отдельной родительской коллекции, или подсекция каждого пользователя действительно зависит от того, как вы будете тянуть журналы и что приведет к быстрым скоростям, сбалансированным с затратами на тяги. Если вы показываете этому пользователю последние 10 поисковых запросов, тогда поисковый журнал будет иметь смысл в качестве подсетей. Если вы вытаскиваете все данные поиска для всех пользователей для анализа, то отдельная коллекция родительского уровня имеет смысл, потому что вы можете вытащить все журналы одним нажатием, чтобы избежать необходимости извлекать журналы из каждого пользователя отдельно.

Вы также можете объединить свои тяги и promises для удобства.

  // Get reference to all of the documents
  console.log("Retrieving list of documents in collection");
  let documents = collectionRef.limit(1).get()
    .then(snapshot => {
      snapshot.forEach(doc => {
        console.log("Parent Document ID: ", doc.id);

        let subCollectionDocs = collectionRef.doc(doc.id).collection("subCollection").get()
          .then(snapshot => {
            snapshot.forEach(doc => {
              console.log("Sub Document ID: ", doc.id);
            })
          }).catch(err => {
            console.log("Error getting sub-collection documents", err);
          })
      });
    }).catch(err => {
    console.log("Error getting documents", err);
  });

Ответ 3

Добавляя к ответу Matt R, если вы используете babel или можете использовать async/wait, вы можете получить тот же результат с меньшим кодом (no catch/then):

// Get reference to all of the documents
console.log("Retrieving list of documents in collection");
let documents = await collectionRef.get();

documents.forEach(async doc => {
  console.log("Parent Document ID: ", doc.id);
  let subCollectionDocs = await collectionRef.doc(doc.id).collection("subCollection").get()
  subCollectionDocs.forEach(subCollectionDoc => {
    subCollectionDoc.forEach(doc => {
      console.log("Sub Document ID: ", doc.id);
    })
});