Метод запроса Spring, извлекающий из коллекции MongoDB, которые удовлетворяют условию двух полей

#java #spring #mongodb

#java #spring #mongodb

Вопрос:

Я использую MongoDB и Spring. Мне нужно извлечь из коллекции MongoDB документы, которые удовлетворяют условию даты и времени. Дата и время хранятся в двух разных полях в виде строк. Вот пример документа:

   {
  "_id":{"$oid":"aaaaaaaaa"},
  "date":{"$date":"2020-12-14T16:30:00.936Z"},
  "potentialUserId":"5fd6d8d3c766eb16c1acd1d1",
  "strDate":"2020-12-14",
  "strTime":"6:30",
  }
 

В настоящее время я извлекаю из коллекции выше всех документов только по диапазону дат и использую пользовательский запрос поиска:

 public interface MeetingRepository extends MongoRepository<Meeting, String> {
    List<Meeting> findByStrDateBetween(String startDay, String endDay);
}
 

Как я упоминал выше, я хочу извлекать из документов коллекции, которые удовлетворяют условию не только даты
, но и времени.

поэтому для этой цели я также могу передать диапазон времени:

 List<Meeting> findByStrDateBetween(String startDay, String endDay, String startTime, String endTime);
 

Но также мне нужно изменить текст имени функции:

 findByStrDateBetween
 

таким образом, он будет фильтроваться не только по полю strDate, но и по полю strTime.

Мой вопрос в том, как изменить findByStrDateBetween , чтобы он удовлетворял обоим условиям?

Комментарии:

1. Скорее всего, нужен пользовательский @Query или использовать комбинацию greaterThan и lessThan

2. @ChristopherSchneider спасибо за сообщение. Не могли бы вы привести пример?

Ответ №1:

Для достижения этой цели есть другой вариант: создать интерфейс, аннотированный @NoRepositoryBean вашим методом извлечения данных, а затем создать класс, который реализует созданный вами интерфейс.

 @NoRepositoryBean
public interface MeetingHandlingRepository {

List<Meeting> findByStrDateBetween(String startDay, String endDay, String startTime, String endTime); 
}
 

Ваш интерфейс будет выглядеть:

 public interface MeetingRepository extends MongoRepository<Meeting, String>, MeetingHandlingRepository {
    List<Meeting> findByStrDateBetween(String startDay, String endDay, String startTime, String endTime); 
}
 

Ваша пользовательская реализация интерфейса:

 public MeetingHandlingRepositoryImpl implements MeetingHandlingRepository {
 private final MongoTemplate mongo;

 public MeetingHandlingRepositoryImpl (final MongoTemplate mongo) {
    this.mongo = mongo;
 }

 @Override
 public List<Meeting> findByStrDateBetween(String startDay, String endDay, String startTime,String endTime) {
 // your implementation mongo.find(new Query().......);
 }
}