Найти / удалить в списке элементов @DBref в MongoDB для Spring - PullRequest
0 голосов
/ 23 октября 2018

Как лучше всего найти и обновить элементы вложенного списка как @DBRef в MongoDB для Spring?

У меня есть AppliedApplication класс:

@Document(collection = "applied_application")
public class AppliedApplication {

    @Id
    private String id;
    @Field("program")
    @DBRef
    private List<Program> programList;

    // getters and setters

}

С Программируйте класс как @DBRef:

@Document(collection = "program")
    public class Program {

        @Id
        private String id;
        @Field("program_name")
        private String programName;

        // getters and setters

    }

Я ищу способ найти и обновить элементы вложенного списка, используя следующие запросы:

Запрос, используемый для поиска объекта Program по объекту It's Id из Коллекция AppliedApplication :

Query query = new Query();
     query.addCriteria(Criteria.where("id").is(applicationId)
      .and("program.$id").is(new ObjectId(programId)));

Program program = mongoTemplate.findOne(query, Program.class);

Запрос, используемый для удаления элемента списка из AppliedApplication :

Update update = new Update().pull("program", new BasicDBObject("program.$id", new ObjectId(programId)));

mongoTemplate.updateMulti(new Query(), update, AppliedApplication.class);

Ни один из них не работает, и я совершенно не знаю.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Найти:

Использовать positional operator / $elemMatch для поиска подходящей DBRef программы в AppliedApplication.

Использование $positional проекция

Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId(applicationId)).and("program.$id").is(new ObjectId(programId)));
query.fields().position("program", 1);
AppliedApplication application = mongoTemplate.findOne(query, AppliedApplication.class);
Program program = application.getProgramList().get(0);

Использование $elemMatch проекция

Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId(applicationId)));
query.fields().elemMatch("program", Criteria.where("$id").is(new ObjectId(programId)));
AppliedApplication application = mongoTemplate.findOne(query, AppliedApplication.class);
Program program = application.getProgramList().get(0);

Удаление:

Использование $pull дляудалить DBRef из списка программ DBref.

Query query = Query.query(Criteria.where("$id").is(new ObjectId(programId)));
Update update = new Update().pull("program", query);
mongoTemplate.updateMulti(new Query(), update, AppliedApplication.class);

Добавить

Используйте $push для добавления новых программ в список.

Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId(applicationId)));
Update update = new Update().push("program", new DBRef("program", new ObjectId(programId));
mongoTemplate.updateMulti(query, update, AppliedApplication.class);
0 голосов
/ 31 октября 2018

Первый запрос будет запущен, если вы вернете AppliedApplication

Query query = new Query();
        query.addCriteria(Criteria.where("id")
            .is(new ObjectId(applicationId))
            .and("program.$id")
            .is(new ObjectId(programId)));
AppliedApplication  application = this.mongoOperations.findOne(query, AppliedApplication .class);

, а затем с помощью объекта приложения получите программу.

Для второго запроса вам нужно изменить,

 Update update = new Update().pull("program", new BasicDBObject("$id", new ObjectId(programId)));

 mongoTemplate.updateMulti(new Query(), update, AppliedApplication.class);

Заменить -> abc. $ Id на $ id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...