You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firestore中使用DocumentReference写入指定postid的子集合文档

Firestore实现对应写入功能的方案

你原来的实时数据库逻辑是在Report/Post节点下以postid为键存储举报数据,对应Firestore的实现代码如下:

import com.google.firebase.firestore.FieldValue;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.DocumentReference;

// 构造对应postid的文档引用,完全对齐原实时数据库的层级结构
DocumentReference reportRef = FirebaseFirestore.getInstance()
        .collection("Report")
        .document("Post")
        .collection("Entries")
        .document(postModel.getPostid());

HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("publisher", FirebaseAuth.getInstance().getCurrentUser().getUid());
// Firestore服务端时间戳,等价于原实时数据库的ServerValue.TIMESTAMP
hashMap.put("time", FieldValue.serverTimestamp());
hashMap.put("info", edt_comment.getText().toString());

// 写入数据
reportRef.set(hashMap)
        .addOnSuccessListener(aVoid -> {
            // 写入成功后的自定义逻辑
        })
        .addOnFailureListener(e -> {
            // 写入失败后的自定义逻辑
        });

如果不需要严格对齐原实时数据库的层级,也可以简化结构,直接把Post举报作为根集合存储,代码更简洁:

DocumentReference reportRef = FirebaseFirestore.getInstance()
        .collection("PostReport")
        .document(postModel.getPostid());
// 后续构造hashMap、set写入的逻辑和上方完全一致

之前写法错误的原因

  • 你使用db.collection("Report").document("Post").set(hashMap)时,是把数据直接写入Report集合下ID为Post的单个固定文档,没有指定要写入的postid作为文档ID,自然无法写入对应postid的条目。
  • db.document("Report/Post")拿到的仍然是Report集合下Post这个固定文档的引用,Firestore要求集合和文档交替嵌套,你需要在该文档下新增子集合存储多条不同postid的举报数据,或者调整结构直接将postid作为上层集合的文档ID。

内容的提问来源于stack exchange,提问作者Emily

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:36:08