【问题标题】:how to check if a collection contains certain sub collection or not in firestore如何检查集合是否包含某些子集合或不在firestore中
【发布时间】:2017-10-16 12:06:08
【问题描述】:

我想在我的firestore做这种类型的收藏

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

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

提前致谢。

【问题讨论】:

  • 检查孩子人数!简直了!
  • 您使用的是实时数据库还是 Cloud Firestore? @AtifAbbAsi 下面的答案似乎是针对 RTDB 的。

标签: android google-cloud-firestore


【解决方案1】:

您的问题中有一些误解需要先澄清:

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

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

因此,如果聊天室包含消息,一个直接的方法就是创建一个代表该聊天室的文档。然后在其中创建消息的子集合。

如果您在创建复合 chatRoom 键之前对 UID 进行排序,则可以使用单个 get() 测试聊天室是否存在。结构如下所示:

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

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

【讨论】:

  • okay, thanks for that information,我是new to Firestore,但曾在 Firebase 数据库中工作过,所以不清楚。让我按照您的方式尝试一下,如果完成,我会将其标记为我的答案。
  • 你能告诉我如何fetch server time in firestore
  • 您无法准确获取服务器时间,但您可以请求服务器在写入时使用服务器时间填充字段,例如doc.update({updateTime: firebase.firestore.FieldValue.serverTimestamp()})。见firebase.google.com/docs/reference/js/…
  • 主要问题是在尝试检查是否存在文档时,无论文档是否存在,它总是返回不等于null。
【解决方案2】:

尝试读取孩子的总数。!希望这个东西可以帮助你。如果你想实现你自己的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);}

【讨论】:

  • 如果你仔细阅读了我的问题,我已经提到我知道我可以获取整个列表,然后检查它是否包含这些值,但如果数据很大,那么它就变成了一个非常漫长的过程,这就是为什么我正在寻找一些替代方案。但是感谢您的努力,如果有其他方法,请告诉我。
  • Firebase 功能是您正在寻找的,我想是的。! @Anmol
  • 如果您想尝试它,还有一件事..在保存数据之前创建一个获取子计数的函数,然后使用您的父节点键添加该子计数。?像 21736172368,1;然后拆分它。!并通过仅从 firebase 读取密钥来获取孩子的数量。!@Anmol
  • but i dont want to read the child count! 我只想得到if my collection contains a specific sub-collection or not.
  • 您只需要在将数据存储到 firebase 数据库之前读取子计数......然后就不需要读取子数了。检索时。? @Anmol
【解决方案3】:

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

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


                        }
                    });

【讨论】:

    【解决方案4】:

    为了让 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")
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-20
      • 2019-09-02
      • 2022-01-04
      • 2017-06-04
      • 1970-01-01
      • 2014-11-14
      • 2017-02-05
      相关资源
      最近更新 更多