Я изучаю Springboot и MongoDB.
У меня есть класс этой модели:
@Data
@Document(collection = "accommodations")
public class Accommodation {
@Id
private String accommodationId;
@TextIndexed
private String title;
@Indexed
private double pricePerNight;
private int guests;
@Indexed
private double rating;
private AccommodationType type;
private String description;
private boolean listed;
private Address address;
private Landlord landlord;
private List<Image> images;
private List<Review> reviews;
private List<Booking> bookings;
public Accommodation(String title, double pricePerNight, int guests, AccommodationType type, String description, Address address, Landlord landlord) {
this.title = title;
this.pricePerNight = pricePerNight;
this.guests = guests;
this.type = type;
this.description = description;
this.listed = true;
this.address = address;
this.landlord = landlord;
this.rating = 0.0;
this.images = new ArrayList<>();
this.reviews = new ArrayList<>();
this.bookings = new ArrayList<>();
}
public boolean isAvailableBetween(LocalDate checkin, LocalDate checkout) {
return this.bookings
.stream()
.noneMatch(b -> (b.getCheckin().isBefore(checkout) || b.getCheckin().isEqual(checkout)) &&
(b.getCheckout().isAfter(checkin)) || b.getCheckout().isEqual(checkin));
}
}
В настоящее время я использую метод isAvailableBetween для фильтрации мест, которые уже забронированы в определенный диапазон дат (регистрация и проверка).
Я хотел бы добиться того же с помощью запроса Mon go, но не могу понять, как.
Это то, что я До сих пор пытался (игнорировать другие фильтры в запросе):
@Repository
public interface AccommodationRepository extends MongoRepository<Accommodation, String>, QuerydslPredicateExecutor<Accommodation> {
@Query("{" +
"$and: [" +
"{listed:true}," +
"{pricePerNight:{$lte:?0}}," +
"{guests:{$gte:?1}}," +
"{rating:{$gte:?2}}," +
"{'landlord.trusted':?3}," +
"{bookings:{$not:{$elemMatch:{checkin:{$lte:?5},checkout:{$gte:?4}}}}}" +
"]" +
"}")
Page<Accommodation> findAccommodationsByFilter(Pageable pageable,
Double pricePerNight,
Integer guests,
Double rating,
Boolean trusted,
LocalDate checkin,
LocalDate checkout
}
Также пытался использовать QueryDSL & Mon go Критерии с Spring Data MongoDB, но не мог найти способ получить тот же результат, что и для isAvailableBetween.
Кто-нибудь знает, как это сделать?