Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Efficiently storing and getting likes in FireStore / Document DB

I have a page with posts and likes for each post.

In FireStore a collection of posts and a collection of likes, and I update the total_likes and recent likes array when a user likes or unlikes a post with cloud functions.

However, I can't figure out how to show for each post if the currently logged in user liked it or not. What's an efficient way to do that for.

Any pointers?

like image 812
Unenumrated Avatar asked Dec 01 '25 23:12

Unenumrated


2 Answers

I believe you might need to look at data aggregration. Even though this example is with Angular, I also use the same principle in a different application: https://angularfirebase.com/lessons/firestore-cloud-functions-data-aggregation/

Alternatively, you could store the post_id's that your user likes in their own 'like_array'. Knowing which posts the user currently sees, you can cross reference the shown post_id's with the (single object) 'like_array' from the user to determine if he/she has liked a particular post. In the long run, you could disambiguate like_arrays based on days or weeks, and only query the like_arrays of this and last day/week - based on what post you are showing. If you are working with categories of posts, similar applies: different like_arrays for different categories.

Hope this helps!

like image 58
davidverweij Avatar answered Dec 03 '25 12:12

davidverweij


One solution would be to have another collection in your Firestore database where you create a document by user, in which you save (and update) an object containing all the posts this user has liked.

Like

- likers    (Collection)
   - UserUID (doc)
      -  postIds {
             post1_UID: true,
             post2_UID: true 
         }

The idea is to use the technique described in the doc, here: https://firebase.google.com/docs/firestore/solutions/arrays#solution_a_map_of_values

I don't know which language you use in the front end but in JavaScript you would do:

var postToTestId = ....;  <- You set this value as you need (e.g. as a function parameter)
firebase.auth().signInWithEmailAndPassword("...", ".....")
    .then(function (info) {
        var postId = 'azer';
        return db.collection('likers')
            .where('postIds.'+ postToTestId, '==', true)
            .get();
    })
    .then(function(querySnapshot) {
        if (querySnapshot.size > 0) {
            console.log("USER LIKES THIS POST!!!");
        }
    })
    .catch(function (error) {
        console.log(error);
    });

I don't think there is any solution without storing somewhere all the posts each user liked...

like image 27
Renaud Tarnec Avatar answered Dec 03 '25 13:12

Renaud Tarnec



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!