java - 如何在 Spring Batch 中使用 MongoItemWriter 更新和插入文档?

标签 java spring mongodb spring-batch spring-data-mongodb

在涉及读写MongoDB的Spring Batch项目中,使用MongoItemWriter写入MongoDB配置如下:

<batch:job id=“someJob”>
    <batch:step id="step1">
        <batch:tasklet>
            <batch:chunk reader=“reader”
                writer=“writer”
                processor=“processor” commit-interval="10" />
        </batch:tasklet>
    </batch:step>
</batch:job>

writer bean配置如下:

<bean id="writer"
    class="org.springframework.batch.item.data.MongoItemWriter">
    <property name="template" ref="mongoTemplate" />
    <property name="collection"
        value="XYZCollection" />
</bean>

然后我们有了模型:

public class Sample {

    @Id
    private ObjectId id;

    @Field(“Field1”)
    private String field1;

    @PersistenceConstructor
    public Sample() { }

    // getter and setters

}

最后,从处理器返回其模型构成MongoDB文档的类的对象,这样ItemWriter就会将其拾取并插入到数据库:

public class Processor implements ItemProcessor<Sample, Sample> {

    @Override
    public Sample process(Sample sampleItem) throws Exception {
        Sample updatedSampleItem = updateSampleItem(sampleItem);
        Sample newSampleItem = createSampleItem(sampleItem);
        return newSampleItem;
    }
}

使用的版本: - Spring 芯 5.1.3.RELEASE - Spring 批处理 4.1.0.RELEASE - spring-data-mongodb 2.1.3.RELEASE

现在,这会将 newSampleItem 保存到 XYZCollection 中,因为它必须这样做。要求是让 Spring-Batch 更新已读取的 sampleItem,然后为 newSampleItem 对象创建一个新文档。有可能这样做吗?如果是,如何?

最佳答案

您可以将 CompositeItemWriter 与两个编写器一起使用,一个更新项目,另一个插入新文档:

  • 对于插入,您可以使用已有的编写器。
  • 对于更新,您需要创建一个新的编写器来扩展 MongoItemWriter 并覆盖 doWrite 以更新项目。这是因为 MongoItemWriter 允许删除或保存文档,但不能更新文档。

然后使用两个编写器作为 CompositeItemWriter 的委托(delegate)。

关于java - 如何在 Spring Batch 中使用 MongoItemWriter 更新和插入文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53695289/

相关文章:

java - 如何在运行时在 Spring Boot 应用程序下将添加/删除路由更新到 Apache Camel 中?

Spring MVC - 从所有拦截器中排除 Assets

java - 我做错了什么,hibernate/spring Boot 显示来自 mysql 的名称

mongodb - 将公里转换为弧度

java - 我收到名为“没有合适的驱动程序”的错误?

java - 为什么我不能将传入的对象分配给方法中的新值?

java - 运行 Grails 项目时出错

c# - Mongodb:如何检查一个点是否包含在多边形中?

javascript - NodeJS 和 node-mongodb-native

java - 为什么求解后PlanningVariable的值没有变化? #OptaPlanner