gpt4 book ai didi

mongodb - 如何更新 mongodb 中的文档以获得性能?

转载 作者:IT老高 更新时间:2023-10-28 12:29:31 26 4
gpt4 key购买 nike

我是 Spring Data Mongo 的新手。我有一个场景,如果 mongo db 中不存在我想创建一个 Study。如果它已经存在,那么我必须用新值更新它。

我尝试了以下方式,在我的情况下效果很好,但就性能而言,我不确定这是更新等的正确/最佳/可取的方式。

有人可以指导一下吗?

public void saveStudy(List<Study> studies) {
for (Study study : studies) {
String id = study.getId();
Study presentInDBStudy = studyRepository.findOne(id);

//find the document, modify and update it with save() method.
if(presentInDBStudy != null) {
presentInDBStudy.setTitle(task.getTitle());
presentInDBStudy.setDescription(study.getDescription());
presentInDBStudy.setStart(study.getStart());
presentInDBStudy.setEnd(study.getEnd());
repository.save(presentInDBStudy);
}
else
repository.save(study);
}
}

最佳答案

您必须使用 MongoTemplate.upsert() 来实现此目的。您将需要再添加两个类: StudyRepositoryCustom 这是一个 interface 和一个扩展此接口(interface)的类,例如 StudyRepositoryImpl

interface StudyRepositoryCustom {
public WriteResult updateStudy(Study study);
}

更新你当前的 StudyRepositoryextend 这个 interface

@Repository
public interface StudyRepository extends MongoRepository<Study, String>, StudyRepositoryCustom {
// ... Your code as before
}

并添加一个实现 StudyRepositoryCustom 的类。这是我们将 @Autowire 我们的 MongoTemplate 并提供更新 Study 的实现或在它不存在时保存它的地方。我们使用 MongoTemplate.upsert() 方法。

class StudyRepositoryImpl implements StudyRepositoryCustom {
@Autowired
MongoTemplate mongoTemplate;

public WriteResult updateStudy(Study study) {
Query searchQuery = new Query(Criteria.where("id").is(study.getId());
WriteResult update = mongoTemplate.upsert(searchQuery, Update.update("title", study.getTitle).set("description", study.getDescription()).set(...)), Study.class);
return update;
}
}

请注意 StudyRepositoryImpl 将自动被 Spring Data 基础设施拾取,因为我们遵循了使用 Impl

检查 this github 上的示例,用于 @Autowire-ing 一个 MongoTemplate 并使用上述自定义存储库。

我没有测试过代码,但它会指导你:-)

关于mongodb - 如何更新 mongodb 中的文档以获得性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40534212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com