Создавайте динамические запросы с помощью Spring Data MongoDB Criteria

Я хотел бы запустить операцию массового удаления в списке документов в MongoDB, которые были выбраны пользователем в пользовательском интерфейсе, поэтому мне нужно динамически построить запрос, который выглядит следующим образом (предложение or расширяется для каждого выбранного документа):

{
    $and: [
        {
            "contentType": "application/vnd.sometype"
        },
        {
            $or: [
                {
                    "metadata.name": "someName",
                    "metadata.version": "someVersion"
                },
                {
                    "metadata.name": "someOtherName",
                    "metadata.version": "someOtherVersion"
                }
            ]
        }
    ]
},
Fields: null,
Sort: null

Только сейчас я использую конкатенацию строк для достижения этой цели.

Можно ли построить этот запрос с помощью Spring Data MongoDB Criteria Builder (org.springframework.data.mongodb.core.query.Criteria)?


person Jamie Cramb    schedule 03.07.2014    source источник


Ответы (2)


Разве это не работает для вас?

Criteria criteria = Criteria.where("contentType").is("application/vnd.sometype");

List<Criteria> docCriterias = new ArrayList<Criteria>(docs.size());

for (Document doc: docs) {
    docCriterias.add(Criteria.where("metadata.name").is(doc.getName())
                               .and("metadata.version").is(doc.getVersion()));
}

criteria = criteria.orOperator(docCriterias.toArray(new Criteria[docs.size()]));

?

person Artem Bilan    schedule 03.07.2014
comment
@Artem Bilan Критерии.orOperator(docCriterias.toArray(new Criteria[docs.size()])); у меня возникает проблема при преобразовании моего списка критериев в массив, он продолжает говорить, что orOperator не определен для критериев []? не могли бы вы помочь? - person Ramzan Zafar; 19.08.2014
comment
Пожалуйста, проверьте версию Spring Data MongoDB. Попробуйте использовать последнюю. - person Artem Bilan; 19.08.2014
comment
Я использую 1.5.0.RELEASE - person Ramzan Zafar; 19.08.2014
comment
он продолжает говорить, что метод orOperator(Criteria...) в типе Criteria неприменим для аргументов (Criteria[]) - person Ramzan Zafar; 19.08.2014
comment
Вы не используете org.hibernate.Criteria по ошибке? - person Artem Bilan; 19.08.2014
comment
Давайте продолжим обсуждение в чате. - person Ramzan Zafar; 19.08.2014
comment
Каков будет порядок выполнения нескольких критериев? - person Prabjot Singh; 20.10.2015
comment
Как напечатать эти критерии? Я хочу увидеть фактический запрос. - person Half Blood Prince; 21.07.2016
comment
См. Criteria.getCriteriaObject().toString(), где последний делает именно это: JSON.serialize(this); - person Artem Bilan; 21.07.2016

Здесь нам нужно построить новый запрос и внедрить критерии в построенный новый запрос. А также мы должны создать список критериев, используя некоторые критерии для встраивания в запрос. Здесь мой пример предоставляет список метаданных, и мы не знаем имя параметра, который будет отправлен для нас. Итак, решение следующее.

List<Criteria> criterias = new ArrayList<>();

    for (MetaData metaData : newDoc.getMetaData()) {
        Criteria dynamicCriteria = Criteria.where("metaData.key").is(metaData.getKey()).andOperator(Criteria.where("metaData.value").is(metaData.getValue()));
        criterias.add(dynamicCriteria);
    }

    Criteria criteria = new Criteria().andOperator(criterias.toArray(new Criteria[criterias.size()]));

    Query searchQuery = new Query(criteria);

    List<Document> documents = mongoTemplate.find(searchQuery, Document.class);
person Sandun Susantha    schedule 03.03.2020