如何使用Spring Batch读取mongo集合的所有文档?

问题描述 投票:0回答:1

我必须在 Spring Batch 期间从 MongoDB 读取整个集合而不使用过滤器。

我创建了一个扩展 MongoItemReader 的类 XyzMongoItemReader 在 XyzMongoItemReader 构造函数上,我设置以下字段:

public XyzMongoItemReader(
        final MongoTemplate template,
        final Query query) {
    setTemplate(template);
    setQuery(query);
    setTargetType(Xyz.class);
}

Xyz 类用 @Document 注释,字段用 @Field 注释:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Xyz {

    @Field
    @JsonProperty
    protected String x;
    
    @Field
    @JsonProperty
    private String y;

    @Field
    @JsonProperty
    private Z z;

}

配置类为:

@Configuration
@EnableBatchProcessing
public class XyzBatchConfigurerReaderFromMongoWriterToRedis extends AbstractBatchConfigurer<Xyz, String> {

    @Autowired
    MongoTemplate mongoTemplate;

    @StepScope
    @Bean
    @Override
    public ItemReader<Xyz> reader() throws Exception {
        return new XyzMongoItemReader(mongoTemplate, new Query());
    }

    ... processor ...

    ... writer ...

}

Mongo上的集合有20条记录,但是执行read方法时,没有检索到文档。

设置这3个参数就够了吗?

  • 模板
  • 查询
  • 目标类型

“new Query()”是能够读取集合中所有文档的正确查询吗?

java mongodb spring-batch spring-data-mongodb
1个回答
0
投票

我从 Query 切换到 queryString,并添加了 setCollection 和 setSort。

public XyzMongoItemReader(
        final MongoTemplate template,
        final String query, 
        final Map<String, Sort.Direction> sorts) {
    setTemplate(template);
    setCollection(Xyz.class.getSimpleName());
    setQuery(query);
    setSort(sorts);
    setTargetType(parametrizedType);
}

读者:

@StepScope
@Bean
@Override
public ItemReader<Xyz> reader() throws Exception {
    return new XyzMongoItemReader(mongoTemplate, "{}", Map.of("_id", Sort.Direction.ASC));
}
© www.soinside.com 2019 - 2024. All rights reserved.