Запрос списка mongoRepository

У меня есть коллекция MongoDB с документами со следующими полями:

  • дата (дата объекта)
  • тип предложения (ул.)

Я хочу написать метод с MongoRepository чтобы найти все документы, которые имеют дату в диапазоне дат, а offerType содержит одну из строк, представленных в списке.


Пример

Документы:

  1. дата: 04.10.2019, offerType: offer1
  2. дата: 11-04-2019, offerType: offer3
  3. дата: 15-04-2019, offerType: offer2
  4. дата: 15-04-2019, offerType: offer1

Я хочу:

  • даты между 9-04-2019 и 12-04-2019
  • следующие предложения: предложение1, предложение3

В предыдущем примере я бы получил документы 1 и 2.


Мой код

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

import java.util.Date;
import java.util.List;

import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;     
public interface ReportVocalOrderRepository extends MongoRepository<ReportVocalOrder, String> {

    List<ReportVocalOrder> findByDateBetween(Date startDate, Date endDate, Pageable pageable);

    List<ReportVocalOrder> findByDateBetweenAndOfferTypeContaining(Date startDate, Date endDate, List<String> offers, Pageable pageable);


}

Вот класс документа:

@JsonInclude(Include.NON_NULL)
@Document(collection = Constants.Mongo.Collections.VOCAL_ORDER_REPORT)
@ApiModel
public class ReportVocalOrder {

    @Id
    private String id;

    private Date date;
private String offerType;
public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
public String getOfferType() {
        return offerType;
    }

    public void setOfferType(String offerType) {
        this.offerType = offerType;
    }
}

Первый метод MongoRepository работает нормально; второй вместо этого возвращает пустой список. Проблема в запросить mongoRepository для поиска поля, которое может содержать одно из значений списка, переданного в качестве аргумента.
Что не так с этой реализацией? Есть ли лучший способ реализовать этот запрос?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 978
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это было проще, чем я думал. Выкладываю ответ, кому интересно:

import java.util.Date;
import java.util.List;

import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;     
public interface ReportVocalOrderRepository extends MongoRepository<ReportVocalOrder, String> {

    List<ReportVocalOrder> findByDateBetweenAndOfferTypeIn(Date startDate, Date endDate, List<String> offers, Pageable pageable);


}

Итак, смысл в том, чтобы использовать ключевое слово In.

У нас есть еще один вариант использования Query

@Query(value = "{ 'groupId' :  ?0 , 'user.$id' : {$in: ?1} }", delete = true)
    List<GroupUser> deleteUserInGroup(String groupId, List<ObjectId> userId);

Можешь попробовать.

Другие вопросы по теме