#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().......);
}
}