Запросы даты с MongoDB и Spring Data MongoDB - PullRequest
0 голосов
/ 04 января 2019

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

Если я сделаю запрос в MySQL, это будет что-то вроде:

MySQL:

SELECT * FROM MotelReservations
WHERE motelId = 'ABC123' AND (
  (dateStart BETWEEN '2018-12-01 00:00:00' AND '2018-12-31 23:59:59') OR (dateEnd BETWEEN '2018-12-01 00:00:00' AND '2018-12-31 23:59:59')
)

Но я не уверен, каким будет эквивалент запроса для mongodb.

MongoDB:

{
  "motelId": "ABC123",
  ???
}

Кроме того, поскольку я буду использовать Spring Data MongoDB специально для хранилища.Я хотел запросить его, используя стиль, подобный JPA, где я могу просто использовать findAllBy... имя метода.Если это невозможно, я могу использовать аннотацию @Query.Проблема, я не уверен, что эквивалент запроса в mongo-db.

Spring Data MongoDB (Репозиторий):

В MotelReservationDao интерфейс,поиск по имени метода findAllBy... или с использованием аннотации запроса

findAllByMotelIdAnd...(String motelId, ...)

@Query(???)
findAllReservationsThatFallsOnGivenDates

Образец документа Mongo:

{
    "reservedBy": "Mang Kanor" ,
    "id":  "b1a7ddd3-ddfd-4624-8e85-79b47fb19f99" ,
    "motelId":  "ABC123" ,
    "dateEnd":  "2018-11-20T10:00:00" ,
    "dateStart":  "2018-11-20T09:00:00" ,
    "summary":  "Enjoy the moment in room 123"
}

1 Ответ

0 голосов
/ 08 января 2019

Эквивалентный запрос в MongoDb

Запрос MongoDb, который можно использовать для получения вашего образца документа,

{$and: [
    {'motelId':{$eq:'ABC123'}},
    {$or: [
        {'dateStart':{$gte: '2018-11-01 00:00:00', $lte: '2018-12-31 23:59:59'}},
        {'dateEnd':{$gte: '2018-11-01 00:00:00', $lte: '2018-12-31 23:59:59'}}
    ]}
]}

Или с неявным оператором $and:

{'motelId':{$eq:'ABC123'},
$or: [
    {'dateStart':{$gte: '2018-11-01 00:00:00', $lte: '2018-12-31 23:59:59'}},
    {'dateEnd':{$gte: '2018-11-01 00:00:00', $lte: '2018-12-31 23:59:59'}}
]}

Эквивалентный запрос для данных Spring mongo

Я не уверен, что вы можете создать этот сложный запрос, используя подпись метода Spring Data.Но вы можете посмотреть в этом разделе для получения дополнительной информации.

1.Использование аннотации @Query

@Query("{'motelId':{$eq:?0},$or: [{'dateStart':{$gte:?1, $lte:?2}},{'dateEnd':{$gte: ?3, $lte:?4}}]}")
public List<MotelReservation> findReservationByDate(String motelId, Date from1, Date from2, Date to1, Date to2); 

2.Использование интерфейса MongoTemplate

MotelReservationDAO

public interface MotelReservationDAO extends MongoRepository<MotelReservation, ObjectId>,
        CustomMotelReservationDAO {

}

Интерфейс CustomMotelReservationDAO

public interface CustomMotelReservationDAO {
  public List<MotelReservation> findReservationByDate(String motelId, Date from1, Date from2, Date to1, Date to2); 
}

Класс CustomMotelReservationDAOImpl

public class CustomMotelReservationDAOImpl implements CustomMotelReservationDAO {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override    
    public List<MotelReservation> findReservationByDate(String motelId, Date from1, Date from2, Date to1, Date to2){

      Query query = new Query(
        Criteria.where("montelId").is(motelId)
        .andOperator(
          Criteria.where("dateStart").gte(from1).lte(from2),
          Criteria.where("dateEnd").gte(to1).lte(to2)
        )
      );

     return mongoTemplate.find(query, MotelReservation.class)
}
...