如何在firestore中检查集合是否包含某些子集合

时间:2017-10-16 12:06:08

标签: android google-cloud-firestore

enter image description here

我想在firestore

中制作此类收藏品

其中chatRooms将是我的集合名称,myUid and opponentsUid的组合将是我的子集合,其中将放置不同的文档。我的问题是我想检查我的集合是否包含名为myUid_opponentsUidopponentsUid_myUid的子集合,并且我无法搜索最佳查询来执行此操作。

我所知道的是,我们可以获取整个列表,然后检查它是否包含特定的房间,但它是一个漫长的过程,所以我想要更好的方法。

提前致谢。

4 个答案:

答案 0 :(得分:1)

您的问题中有一些误解首先要清理:

  1. 在Firestore集合中,作为不同的实体并不存在。它是集合中的文档,使其变得可见。

  2. 此外,集合只能包含文档,而文档又可以包含集合,但结构必须交替,因此您不能拥有名为chatRooms的集合,其中包含集合myUid_opponentUid。在chatRooms里面必须有一个文件。

  3. 因此,如果聊天室包含消息,那么直接执行所需操作的方法是创建表示该chatRoom的文档。然后在其中创建消息的子集合。

    如果在创建复合chatRoom密钥之前对UID进行排序,则可以使用单个get()来测试聊天室是否存在。结构看起来像这样:

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

    请注意,您实际上并不需要在chatRoom/(uid-pair)级别存储任何内容来创建messages级别的子级:您只需创建新邮件并直接收听。

答案 1 :(得分:0)

尝试阅读孩子总数。希望这件事可以帮助你。如果你想实现你自己的api然后尝试使用Firebase Functions ..我想要添加的最后一件事是,如果你想添加get Count而不读取你必须的孩子的数量在存储数据之前实现一个getChildCount方法,然后用JiGh_31GA20JabpZBfa,1`这样的键附加它们,只读取密钥然后使用逗号分隔符,你会得到这个父元素是否包含子元素的结果。

    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);}

答案 2 :(得分:0)

我知道我迟到了。 为将来的用户发布。 试试这个:

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();


                        }
                    });

答案 3 :(得分:0)

要让Firebase Firestore检查文档是否具有条目(字段),请使用此命令

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