The structure of my Firestore follows.
Posts - Post # - Fields(Post Title, date, CommentId[])
Comments - Comment # - Fields(Title, date, UserId)
Users - User # - Fields(username, photo,...etc)
the user# is equivalent to UserId from the field in the comment.
meaning:
Posts - PostId7777 - Fields("Morning!", 02/04/22, [] {CommentId8888, ....))
Comments - CommentId8888 - Fields("Hello World!", 02/10/22, userid9999)
Users - userid9999 - Fields("exampleUser, ......)
Since I found this structure is the most efficient, whenever I load comments first I get the array of comment Ids from the post, then load the comments using collection.whereIn(FieldPath.documentId, commentIds).
and Then I load user info using the userIds from comment fields.
But the problem arises here.
Among the comments, there might be a duplicate author(user).
so let's say there are 5 comments. 3 comments have non-duplicate author, but the remaining 2 is from the same user.
so when I query mDB.collection("users").whereIn(FieldPath.docId(), uIDs).get() queryDocSnapshots will only have 4 snapshots because 2 comments are from the same author.
Please keep in mind that querying in a loop won't work since Firebase queries asynchronously. I need an alternative for the WHERE-IN.
public static void forum_get_comments_step_two(Context _context, String _action, ArrayList<Comment> _retVal, ArrayList<String> _uIds) {
        ArrayList<Comment> newRetVal = new ArrayList<>();
        mDb.collection("users").whereIn(FieldPath.documentId(), _uIds).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                int x = 0;
                for (DocumentSnapshot doc : queryDocumentSnapshots) {
                    Comment currVal = _retVal.get(x);
                    User user = new User(doc.getId(), doc.getString("username"),
                            Integer.parseInt(doc.get("emblem_league").toString()),
                            Integer.parseInt(doc.get("emblem_team").toString()));
                    newRetVal.add(new Comment(currVal.getPostId(), user, currVal.getDesc(),
                            currVal.getParentId(), currVal.getMentionId()));
                    x++;
                }
                sendBroadcast(_context, _action, true, newRetVal);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.i(TAG, "getCommentsStep2 failure: " + e.getLocalizedMessage());
                sendBroadcast(_context, _action, false, null);
            }
        });
    }