Springdata: mongodb находит запрос с необязательными «критериями»

1

Хьюстон, у меня проблема (привет всем!).

Я использую аннотацию springdata @query, и мне нужно выполнить запрос поиска с некоторыми критериями.

Предполагая, что мой объект коллекции похож:

  • код
  • Дата
  • ключ
  • Учетная запись {email, firstname, lastname}
  • положение дел

и мой объект критериев поиска

  • код
  • Дата
  • ключ
  • Эл. адрес
  • положение дел

Мне нужно искать в коллекции документ, соответствующий моим критериям.

Проблема заключается в том, что критерии поиска не являются обязательными, поэтому я могу иметь некоторые нулевые параметры (например, иногда мне приходится искать документ с конкретным кодом и датой, иногда с определенным электронным письмом и т.д.), Поэтому я начал googling для решения.

Я читал о $ или и $ и операторе (я сожалею о повторении и повторении), я пытался реализовать решение (знаю, делаю или нет, нет попытки), но я очень смущен тем, как заставить его работать.

Текущая ситуация:

@Query(value = "{date: { $exists: false }, key: ?0 , $or : [{$or : [{$where: '?1==null'}, {code : ?1}]},{$or : [{$where: '?2==null'}, {status : ?2}]}]}")
public Page<Notification> findByNotificationCriteria(Pageable page, String key, String code, String status);

(я попробовал также с $ и оператором в начале)

но результаты не то, что я ожидаю.

Я делаю что-то неправильно или это просто проблема springdata?

Благодарю.

Теги:
spring
spring-data
spring-data-mongodb

1 ответ

1

Я знаю, что это не настоящее решение.

  1. Вы можете использовать query-dsl для выполнения этого. Вот хороший учебник: http://www.littlelostmanuals.com/2011/09/spring-mongodb-type-safe-queries.html
  2. (Подождите) Также посмотрите на этот вопрос Jira, если поддержка таких вещей весной-jpa будет очень скоро в монго. https://jira.spring.io/browse/DATAJPA-209
  3. Вы также можете использовать класс MongoTemplate напрямую OR
  4. Расширьте свой репозиторий в зависимости от весенних данных. http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

В вашем случае я бы пошел с query-dsl, так как вам нужно сделать это один раз и охватить все репозитории. (1)

Примечание. Чтобы сделать это немного лучше, не используйте com.mysema.query.apt.QuerydslAnnotationProcessor вместо этого используйте org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor для которого вам не нужно использовать query-dsl @QueryEntity ;)

Если у вас есть только один репозиторий, где у вас есть дополнительные параметры, рассмотрите подкласс хранилища (4)

  • 0
    Спасибо за информацию, они очень полезны. В конце концов, я использовал шаблон монго (я уже знал логику, и у меня не было так много времени, чтобы реализовать что-то новое). Все отлично работает Я надеюсь.
  • 0
    Как приложение: Есть другие случаи, когда вы не можете использовать query-dsl, кстати, и вам приходится иметь дело с MongoTemplate: jira.spring.io/browse/DATAMONGO-595 Я полагаю, есть еще такие вещи ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню