Anmol317
Anmol317

Reputation: 1376

how to check if a collection contains certain sub collection or not in firestore

enter image description here

i want to make this type of collection in my firestore

where chatRooms will be my collection name, combination of myUid and opponentsUid will be my sub-collection in which different documents will be placed. My problem is i want to check if my collection contains sub-collection named myUid_opponentsUid or opponentsUid_myUid and i am not able to search a best query for doing this.

All i know is that we can fetch the whole list and then check if it contains the specific room or not, but its a lengthy process, so i want to better method for it.

Thanks in advance.

Upvotes: 2

Views: 3700

Answers (4)

Mhamza007
Mhamza007

Reputation: 151

For Firebase Firestore to check whether the document has entries (fields), Use this command

firebaseFirestore.collection("Users").document(userId)
  .addSnapshotListener {
    documentSnapshot, _ ->
        if (documentSnapshot!!.contains("name")) {
            Log.i("Name", "Name exists")
        } else {
            Log.i("Name", "Name doesn't exists")
        }
}

Upvotes: 0

Zubayr
Zubayr

Reputation: 456

I know I am late. Posting for future users. Try this:

DocumentReference datab = db.collection("collection_name").document("Doc_name");


                    datab.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                        @Override
                        public void onSuccess(DocumentSnapshot documentSnapshot) {

                            if(documentSnapshot.contains("field_name"))
                            {
                                Toast.makeText(YourActivity.this, "Child exixts.", Toast.LENGTH_SHORT).show();

                            }
                            else
                                Toast.makeText(YourActivity.this, "Doesnt exits.", Toast.LENGTH_SHORT).show();


                        }
                    });

Upvotes: 0

Gil Gilbert
Gil Gilbert

Reputation: 7870

There are a few misconceptions in your question to clear up first:

  1. In Firestore collections don't really exist as distinct entities. It's the documents inside a collection that cause it to become visible.

  2. Also, collections can only contain documents, which in turn can contain collections, but the structure must alternate, so you can't have a collection called chatRooms that contains a collection myUid_opponentUid. Inside chatRooms there must be a document.

So if chat rooms contain messages, a straightforward way to do what you want is to create a document that represents that chatRoom. Then within that create a subcollection for the messages.

If you sort the UIDs before creating the composite chatRoom key you can then test whether or not the chat room exists by using a single get(). The structure would look like this:

chatRooms/(uid-pair)/messages/(message-id)

Note that you don't actually need to store anything at the chatRoom/(uid-pair) level to create children at the messages level: you can just create new messages and listen directly.

Upvotes: 1

Atif AbbAsi
Atif AbbAsi

Reputation: 6035

Try to Read Total Number of child .! Hope this thing may helps you.and if you want to implement your own api then try using Firebase Functions..and last thing I want to add is that if You want to add get Count without reading number of child you have to implement one method that getChildCount before storing data and then append them with key like JiGh_31GA20JabpZBfa,1` and only read keys and then use comma separator and you will get your result that this parent contains child or not.?

    DatabaseReference myRef = database.getReference();

      //You can use the single or the value.. depending if you want to keep track
     String id= UUID.randomUUID().toString();//randomID for task

    Object object=new Object ();      




    public int chidcount(String child){

 string childcount="0";


  //You can use the single or the value.. depending if you want to keep track
 myRef.child(child).addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
   for (DataSnapshot snap: dataSnapshot.getChildren()) {

        childcount=snap.getChildrenCount();
        Log.e(snap.getKey(),snap.getChildrenCount() + "");
    }

    addvalue(childcount);

   }

  @Override
 public void onCancelled(DatabaseError databaseError) {

    }
        });

}


private addvalue(String childcount){
 object=setid(id);

     object=setname("name");

      getchildCount("object");

        mdatabaseRef.child("rating").child(manager.getId()+childcount).child(currentEmployee.getId()).child(id).setValue(rating);}

Upvotes: 0

Related Questions