Почему данные, извлеченные из Firestore, возвращают пустой массив при наличии подколлекций? - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь получить данные из базы данных моего пожарного магазина, используя angularfire2. Вот как выглядит моя текущая база данных. У меня есть коллекция пользователей, которая содержит документ userId, который связывает вместе userDetails и userPosts. enter image description here

Однако, когда я запрашиваю эту коллекцию, в консоли возвращается пустой массив.

enter image description here

Я использую функцию Firebase для получения данных.

Функция Firebase Index.ts

export const getFeed = functions.https.onCall(async (req,res) =>{
  const docs = await admin.firestore().collection('users').get()
    return docs.docs.map(doc => {
    return {
        postID: doc.id,
        ...doc.data()
         }
     }) 
 })

Файл TS

  tabTwoFeedInit (){    
      const getFeed = this.aff.httpsCallable('getFeed')
      this.ajax = getFeed({}).subscribe(data=> {
        console.log(data)
        this.posts =  data 
          })  
      }

Как успешно получить данные из этой базы данных Firebase?

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Firestore чтения незначительны , поэтому они не возвращают вложенные коллекции автоматически. Таким образом, ваш get() будет возвращать только идентификатор документа, так как в документе нет полей.

Чтобы вернуть вложенные коллекции документа, вам нужно вызвать метод getCollections наэтот документ. Это может быть сделано только через API администратора, но это должно подойти вам, поскольку вы работаете внутри облачной функции. Как отмечается в документации, обычно ожидается, что имена коллекций являются предсказуемыми (как, по-видимому, и в вашем случае), но если это не так, вы можете рассмотреть реструктуризацию своих данных.

Почему желательно поверхностное чтение? Это позволяет избежать извлечения потенциально больших коллекций информации, которые могут быть связаны, скажем, с пользователем, поэтому вы можете структурировать данные более естественно . В зависимости от размера данных, возможно, что поле, являющееся картой, может иметь больше смысла для userDetails (но коллекция, вероятно, подходит для userPosts).

0 голосов
/ 01 ноября 2019

Если вы просто создаете облачную функцию для извлечения сообщений из этой структуры. Я бы предпочел немного реструктурировать базу данных и просто использовать запрос группы сбора на стороне клиента (без необходимости использования облачных функций) для извлечения сообщений.

Под реструктуризацией я имею в виду, что вы должны хранить userID внутридокументы userPosts подколлекция.

Затем просто пользователь Запрос группы сбора для получения сообщений определенных пользователей.

Синтаксис библиотеки javascript firebase. Вы можете найти его эквивалент angularfire

let posts= db.collectionGroup('userPosts').where('userId', '==', 'some-user-id');
...