Оптимальный способ дублирования монго-документа с использованием Spring Java - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть документ, имеющий следующую структуру:

report {
    _id : "Jan-2018-0" // (Month-Year-Version)
    month : "Jan",
    year : 2018,
    version : 0,
    data : [......]
}

Список данных действительно огромен. Теперь мой вариант использования заключается в создании нового отчета с версией 1, который состоит из существующих данных в версии 0.

РЕДАКТИРОВАТЬ : Это не просто обновление версии. Это скорее создание дубликата существующего документа.

Самый простой способ - прочитать из базы данных версии 0 и обновить идентификатор как «Jan-2018-1», а затем сохранить.

Но так как список данных огромен, я думаю, что не стоит читать весь документ.

Итак, сейчас я читаю документ, избегая поля данных, а затем сохраняю отчет после обновления идентификатора. А затем прочитайте данные на страницах и добавьте их в новую версию.

Примерно так:

Для сохранения новой версии без данных

Report report = reportRepository.findReport("Jan", 2018, 0); // ignores data field
report.setId("Jan-2018-1");
report.setVersion(1);
reportRepository.save(report);

Псевдокод для заполнения данными:

List<Data> datas = reportRepository.getDataByPages("Jan", 2018, 0, 0//offset, 100 //limit);
reportRepository.addData("Jan", 2018, 1, datas);

Есть ли другие подходы лучше, чем этот? Использование Java Spring Mongo.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете создать собственное на месте обновление без извлечения вашей сущности. Вот шаги, которые вам нужно предпринять:

1. Создайте пользовательский репозиторий для отчета о сущности:

public interface CustomReportRepository{
    public void updateVersionByYearAndMonth(Integer year,String month, Integer version)
}

2.Создать реализацию хранилища CustomeRepository:

1-й по совокупности, вы копируете свой документ в коллекцию, Во-вторых, при обновлении операция сопоставления приведет к созданию двух документов, в которых вам нужно будет обновить только один из них.

@Repository
public class CustomReportRepositoryImpl implements CustomReportRepository {
    @Autowired
    private MongoTemplate mongoTemplate;


    @Override
    public void updateDocumentTitle(Integer year, String month, Integer version) {

        MatchOperation matchOperation =
            match(new Criteria().andOperator(
                Criteria.where("year").is(year),
                Criteria.where("month").is(month)
            ));

        Aggregation aggregation = newAggregation(matchOperation, out("yourCollectionName"));
        //copy document by aggregation
        mongoTemplate.aggregate(aggregation, "yourCollectionName", Report.class);


        Query query = new Query();
        query.addCriteria(
            new Criteria().andOperator(
                Criteria.where("year").is(year),
                Criteria.where("month").is(month)
            )
        );
        Update update = new Update();
        update.set("version", version);
        //apply update to first
        mongoTemplate.update(Report.class).matching(query).apply(update).first();

    }
}

3. Расширьте свой репозиторий из интерфейса customReportReposiotry:

public interface ReportRepository extends MongoRepository < Report, String > , CustomReportRepository {
    public void updateVersionByYearAndMonth(Integer year, String month, Integer version)

}
...