spring-data-mongo - необязательные параметры запроса?

Я использую spring-data mongo с методами запроса на основе JSON и не знаю, как разрешить необязательные параметры в поисковом запросе.

Например, скажем, у меня была следующая функция

@Query("{ 'name' : {$regex : ?0, $options : 'i'}, 'createdDate' : {$gte : ?1, $lt : ?2 }} }")
List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange);

- но я не хотел применять совпадение имени с регулярным выражением или не применять ограничение диапазона дат, если в метод были переданы значения NULL.

На данный момент похоже, что мне, возможно, придется построить запрос, используя шаблон mongoTemplate.

Есть ли альтернативы или лучше использовать mongoTemplate?

Спасибо


person Andrew B    schedule 23.07.2012    source источник
comment
На данный момент я пошел по пути использования классов Criteria. Это кажется намного чище, чем встраивание запросов JSON в аннотации, и проще настроить извлекаемые поля.   -  person Andrew B    schedule 24.07.2012


Ответы (1)


Чтобы реализовать это в булевой логике, я делаю следующее и преобразовываю в операции, доступные в языках программирования.

:query != null -> field == :query
!(:query != null) || (field == :query)
(:query == null) || (field == :query)

В простом SQL это делается как

where (null = :query) or (field = :query)

В MongoDB это делается через $where

{ $where: '?0 == null || this.field == ?0' } 

Мы можем ускорить это немного, используя Mongo Operations, а не встраивая все в функцию за счет некоторой удобочитаемости. не работает к сожалению.

{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] } 

Итак, что у вас есть

@Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }")
List<Something> findAll(String query, Pageable pageable);

Это может быть дополнительно расширено для обработки массивов для предложений in/all.

@Query("{ $or : [ { $where: '?0.length == 0' } , { field : { $in : ?0 } } ] }")
List<Something> findAll(String query, Pageable pageable);
person Archimedes Trajano    schedule 28.08.2012
comment
Если ваш параметр запроса имеет тип Date, вы должны написать часть $where следующим образом: { $where: '\\'?0\\' == \\'null\\'' } - person Rares Oltean; 25.08.2020