首页 > 解决方案 > 我如何在 Firestore 中使用 DocumentRecerence?

问题描述

如何在 Firestore 中设置子收集?

这是我的实时数据库格式

在此处输入图像描述

我试着用这种方式db.collection("Report").document("Post").set(hashMap).addOnSuccessListener

但它无法设置我的帖子 ID (-MkllN0v3il1s85g4BT4)

-MkllN0v3il1s85g4BT4 是我的帖子 ID。

然后我用DocumentReference d1 = db.document("Report/Post");

但是如何设置 document(postid) ?

实时DB hashMap方式

DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Report").child("Post");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("publisher",FirebaseAuth.getInstance().getCurrentUser().getUid());
hashMap.put("time", ServerValue.TIMESTAMP);
hashMap.put("info", edt_comment.getText().toString());
reference.child(postModel.getPostid()).setValue(hashMap);

标签: androidfirebasegoogle-cloud-firestore

解决方案


如果您想完全自由地确定要存储的树,您应该坚持使用实时数据库。

另一方面,如果您想切换到 Firestore,则必须找到一种方法将您的数据模型(不仅是 JSON,还包括应用程序的模型)映射到 Firestore 的文档/集合模型中。

我发现将复数用于集合名称很有帮助,因此即使仅从名称中也可以清楚地看出这些是集合。文档名称通常由数据库本身或某些其他系统生成(例如用户的 UID,或日期/时间的时间戳)。


考虑到这些知识,我希望您的结构是:

Reports (collection)
   $reportID (docs)
      Posts (collection)
         $postID (docs)

即使应用程序中只有一个报告,我也会使用这种方法。在这种情况下,我会为该报告使用固定的名称/文档 ID:

Reports (collection)
   Default (doc)
      Posts (collection)
         $postID (docs)

如果您不希望扩大报告的数量,也不在Default文档中存储报告的信息,您可以考虑完全删除顶级集合,并将其建模为:

ReportPosts (collection)
   $postID (docs)

推荐阅读