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

Firestore事务中如何将文档快照转为对象列表并获取文档ID

在Firestore事务中获取带文档ID的Courses对象列表

你的核心问题是DocumentSnapshot.toObject(Courses.class)不会自动将文档ID映射到你标记了@Exclude的id字段,需要手动提取ID并赋值。下面是具体的解决方法:

先纠正代码误区

你当前的代码存在类型错误:transaction.get(document1)返回的是单个文档快照,调用toObject(Courses.class)得到的是单个Courses对象,而非列表。如果要获取多个文档的列表,需要先查询集合。

正确实现步骤

1. 在事务中获取集合的所有文档快照

假设你的课程数据存在名为courses的集合中,先在事务中执行查询获取所有文档快照:

// 获取courses集合引用
CollectionReference coursesCollection = FirebaseFirestore.getInstance().collection("courses");
// 事务中执行查询,返回集合快照
QuerySnapshot querySnapshot = transaction.get(coursesCollection);

2. 遍历快照,生成带ID的Courses列表

遍历每个文档快照,先转成Courses对象,再通过DocumentSnapshot.getId()提取文档ID,调用setId()赋值后加入列表:

List<Courses> coursesList = new ArrayList<>();
for (DocumentSnapshot doc : querySnapshot.getDocuments()) {
    Courses course = doc.toObject(Courses.class);
    if (course != null) {
        // 关键:手动设置文档ID到Courses对象
        course.setId(doc.getId());
        coursesList.add(course);
    }
}

单个文档的处理(针对你原代码的场景)

如果只是获取单个文档(比如document1是单个文档引用),代码如下:

DocumentSnapshot docSnapshot = transaction.get(document1);
Courses course = docSnapshot.toObject(Courses.class);
if (course != null) {
    course.setId(docSnapshot.getId());
    // 此时course对象已包含文档ID
}

补充说明

你的Courses类中用@Exclude标记id字段是正确的,这样Firestore写入数据时不会将该字段存入数据库,但读取时toObject()方法会忽略这个字段,所以必须手动提取文档ID并赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:50:06