Zer0
Zer0

Reputation: 1022

How to load multiple collections from Firestore that have related fields?

Let's say I have 2 models.

  1. Post
  2. Author

The Author looks like below:

{
    authorId: 'ghr4334t',
    fullName: 'This is a post!'
    Nickname: 'Avola
}

The Post looks like below and will have a reference to the author like below:

{
    postId: '12fdc24',
    authorId: 'ghr4334t',
    content: 'This is a post!'
}

Currently, when a user clicks on a post, in order to show all the relevant information, I load the data as follow:

getPost(postId).then(post=> {
   getAuthor(listing.uid).then((document) => {
       // update state so I have the post object and author object.
   })
})

So the above, I load the post, then I load the author. Once I've loaded them both, I can finally construct a custom object:

const finalPost = {
    author: { ...this.state.authorData },
    post: { ...this.state.postData }
}

Naturally..If I have a couple more fields that reference other collections, there will be a nest of get and .then() calls like below:

getPost(postId).then(post=> {
   getAuthor(listing.uid).then((document) => {
      getSomethingElse(listing.uid).then((document) => {
         getAnother(listing.uid).then((document) => {
             // finally update state with everything.
         })
      })
   })
})

Is there a more a better way to load related information together without having to stack .then() calls?

Upvotes: 0

Views: 62

Answers (1)

gso_gabriel
gso_gabriel

Reputation: 4670

Unfortunately, there isn't a better way to achieve what you want, with queries directly. Queries in Firestore doesn't provide you with many options on how to query and return data, mainly, when you would need to do any kind of JOIN on them, to search via references, which makes the work not very easy. I believe the way you are doing is the best option you have for more now.

An alternative you can try is to have Subcollections, where you will have a subcollection of Author inside your collection Post. This way, you will only treat with the reference of the Post, since the Author will be within the document of each specific Post. This way, the queries would be more simple, looking like this below. Of course, this would require you to modify your database.

var messageRef = db.collection('Post').doc('Post1')
                .collection('Author').doc('Author1');

In case you still think this is not enough, I would recommend you to raise a Feature Request at Google's System, where the Google Developers will be able to check if having a new way of getting data is possible to be implemented.

Let me know if the information clarified your doubts!

Upvotes: 1

Related Questions