Spring Batch读取MongoDB全集合无数据:参数配置是否正确?
Spring Batch读取MongoDB全集合问题解答
核心结论
- 仅设置MongoTemplate、Query、targetType这三个参数不够,缺少关键配置会导致读取不到数据。
new Query()本身可以正确匹配集合中所有文档(等价于MongoDB原生查询db.collection.find({})),查询逻辑没有问题。
问题原因与解决办法
1. 未指定MongoDB集合名称
MongoItemReader无法自动通过@Document注解的集合名关联到目标集合,必须显式指定:
- 在自定义
XyzMongoItemReader的构造方法中添加集合名称配置:
public XyzMongoItemReader(MongoTemplate mongoTemplate, Query query, Class<Xyz> targetType) { super(); setMongoTemplate(mongoTemplate); setQuery(query); setTargetType(targetType); // 替换为Xyz类@Document注解中指定的集合名,或实际集合名称 setCollection("xyz"); }
- 或者在配置类中给读取器设置集合名称:
@Bean public XyzMongoItemReader xyzItemReader(MongoTemplate mongoTemplate) { XyzMongoItemReader reader = new XyzMongoItemReader(mongoTemplate, new Query(), Xyz.class); reader.setCollection("xyz"); return reader; }
2. 分页配置异常(可选)
MongoItemReader默认采用分页读取,默认pageSize为10。如果需要一次性读取全量数据,可以设置pageSize大于等于集合总记录数:
reader.setPageSize(20); // 你的集合有20条记录,设为20即可
3. 验证MongoTemplate连接正确性
确认MongoTemplate配置的数据库与目标集合所在数据库一致,避免连接到错误的库导致读不到数据。
4. 字段映射校验(辅助排查)
虽然@Field注解已添加,需确认注解指定的字段名与MongoDB文档中的字段名完全匹配(包括大小写、嵌套结构),避免出现读取后字段为空的情况,但这不会导致完全读取不到数据。
内容的提问来源于stack exchange,提问作者Paul Marcelin Bejan
相关产品推荐
相关产品推荐

