Mithun S
Mithun S

Reputation: 418

Firestore to query Array sub collection

I

I have my firestore collection structure as shown in the image. Following is the main collection name which contains currently logged userId as a document ("AuScbj..") which contains a subcollection called uIds which contains the user ids of users he follows.

When logged in user ("AuScbj..") visits a particular user profile, how can I check whether that profile user's Id available in his following list just by querying like below

firebaseFirestore.collection("Following)
.document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.collection("uIds").where(

Upvotes: 0

Views: 152

Answers (2)

Alex Mamo
Alex Mamo

Reputation: 138989

To check if id1 is present inside the uIds array in a really simpler manner, first, you should create a class:

class Document {
    List<String> uIds;
}

Then get the "AUScbTj5MpNY.." document and read the content of the uIds array using the following method:

private void checkId(String id) {
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    CollectionReference followingRef = rootRef.collection("Following");
    DocumentReference uidRef = followingRef.document(uid);
    uidRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    List<String> uIds = document.toObject(Document.class).uIds;
                    if (uIds.contains(id)) {
                        //Update the UI
                    }
                } else {
                    Log.d(TAG, "No such document");
                }
            } else {
                Log.d(TAG, "get failed with ", task.getException());
            }
        }
    });
}

Inside the onComplete, we get the array as a List and check if the id with which we are calling the method, exists inside the array. To make it work, kick it off with:

checkId(id1);

Please also note that:

firebaseFirestore.collection("Following)
    .document(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .collection("uIds").where(/* ... /*);

Will never work, as uIds is an array inside a document and not a collection.

You can also find more info, in the following article:

Upvotes: 0

LeadDreamer
LeadDreamer

Reputation: 3499

You're looking for .where(fieldPath: "uids", opStr: "array-contains", value: followingUID). It should work with your simple "array" data.

Upvotes: 0

Related Questions