如何从 2 个集合中读取数据并从两个集合中保存数据并将其保存在 SpringBatch 的第 3 个集合中

Posted

技术标签:

【中文标题】如何从 2 个集合中读取数据并从两个集合中保存数据并将其保存在 SpringBatch 的第 3 个集合中【英文标题】:How to read data from 2 collections and save data from both collection and save it in 3rd collection in SpringBatch 【发布时间】:2021-08-20 01:53:56 【问题描述】:

我正在使用 springbatch 使用 MongoItemReader bean 从 mongo db 读取数据。假设我想从同一个作业实例中的 2 个不同集合中读取数据。这可能吗?

@Bean
@StepScope
public MongoItemReader<Object> reader() throws UnexpectedInputException, ParseException, Exception 
    DataReader dataReader = new DataReader();
    return dataReader.read();


@Bean
public DataItemProcessor processor() 
    return new DataItemProcessor();


@Bean
public MongoItemWriter<DestinationCollectionModelClass> writer() 
    MongoItemWriter<DestinationCollectionModelClass> writer = new MongoItemWriter<>();
    writer.setCollection("collection_name_where_data_is_saved");
    writer.setTemplate(mongoTemplate);
    return writer;


@Bean
public Step step1(MongoItemWriter<DestinationModelClass> writer) throws UnexpectedInputException, ParseException, Exception 
    return stepBuilderFactory.get("step1")
            // TODO: P3 chunk size configurable
            .<Object, DestinationModelClass>chunk(100)
            .reader(dataReader())
            .processor(processor())
            .writer(writer())
            .build();


下面是我的类DataReader.java

公共类 DataReader 扩展 MongoItemReader

@Autowired
private MongoTemplate mongoTemplate;

@Override
public MongoItemReader<Object> read() throws Exception, UnexpectedInputException, ParseException 

    List<Object> mongoItemReaderList = new ArrayList<>();

    Map<String, Direction> sorts = new HashMap<>();
    sorts.put("_id", Direction.ASC);
    

    MongoItemReader<Object> collectionOneReader = new MongoItemReader<>();
    collectionOneReader.setTemplate(mongoTemplate);
    collectionOneReader.setTargetType(CollectionOneModelClass.class);
    collectionOneReader.setQuery("");
    collectionOneReader.setSort(sorts);
    
    MongoItemReader<Object> collectionTwoReader = new MongoItemReader<>();
    collectionTwoReader.setTemplate(mongoTemplate);
    collectionTwoReader.setTargetType(CollectionTwoModelClass.class);
    collectionTwoReader.setQuery("");
    collectionTwoReader.setSort(sorts);

    mongoItemReaderList.add(collectionOneReader);
    mongoItemReaderList.add(collectionTwoReader);

    MongoItemReader<Object> readerObject =  (MongoItemReader<Object>) mongoItemReaderList;
    return readerObject;

下面是我的 DataItemProcessor.java

公共类 DataItemProcessor 实现 ItemProcessor

public DataItemProcessor() 

@Override
public DestinationModelClass process(Object phi) throws Exception 
    DestinationModelClass hbd = new DestinationModelClass();
    if(phi instanceof CollectionOneModelClass) 
        //Processing code if Object is an instance of CollectionOneModelClass
    
    
    if(phi instanceof CollectionTwoModelClass) 
        //Processing code if Object is an instance of CollectionTwoModelClass
    
    return hbd;

【问题讨论】:

没有 Spring Batch你会怎么做?请为此分享您的代码。您是否打算“加入”两个系列?在这种情况下你会如何定义一个项目? 我不想加入集合。在我的处理器中,我将使用 collection1 的一些属性和 collection2 的一些属性并保存在第三个集合中。我正在编辑我的问题并添加我的代码 sn-p 请先用一个例子解释您的问题,然后再分享您尝试的解决方案。 问题是我需要从 2 个不同的集合中读取数据并处理它们,并使用两个集合中的一些数据并将其保存在第三个集合中 【参考方案1】:

在同一个面向块的步骤中不能有两个阅读器。您可以做的是使用driving query pattern,在您的情况下,可以按如下方式实现:

项目阅读器:从集合 1 中读取项目 项目处理器:丰富集合 2 中的项目 Item Writer:将丰富的项目写入集合 3

【讨论】:

谢谢@Mahmoud Ben Hassine,我会检查链接。 好的,如果您需要帮助,请告诉我。否则,如果有帮助,请考虑接受答案:***.com/help/someone-answers。谢谢。 我通过在 Mongo 查询中创建视图实现了我的要求。我正在使用聚合查询创建视图 -$lookup –

以上是关于如何从 2 个集合中读取数据并从两个集合中保存数据并将其保存在 SpringBatch 的第 3 个集合中的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据库中读取概率分布并将它们保存在集合中

从 txt 文件中读取数据并将其添加到 Observable 集合中

SequenceInputStream:序列流

在ArangoDB中映射两个图形数据库

如何保存变量并从两个不同的类中使用它Objective C

将抽象数据类型保存和加载到 json 文件并从游戏中的文件中读取 Haskell