2015-01-11 4 views
1

У меня есть документы в коллекции MongoDB, который выглядит, как показано ниже:Как запросить для объектов между датой диапазонами

"listingReservation" : { 
    "reservationFromDate" : new Date("14.1.2015 00:00:00"), 
    "reservationToDate" : new Date("17.1.2015 00:00:00"), 
    "reservationCreatedBy" : "[email protected]", 
    "reservationCreatedOn" : "", 
    "reservationChangedBy" : "", 
    "reservationChangedOn" : "", 
    "reservationStatus" : "pending" //status can be pedning, accepted or rejected 
    } 

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

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

Я попытался выполнить запрос ниже, но, очевидно, все условия не работают.

db1.reservationTable.update(
      { 
       $and: [{ 
        $or: [{ 

         $or: [ 
          { 
           'listingReservation.reservationFromDate': { 
            $gte: new Date(req.body.listingReservation.reservationFromDate), 
            $lt: new Date(req.body.listingReservation.reservationToDate) 
           } 
          }, 
          { 
           'listingReservation.reservationToDate': { 
            $gte: new Date(req.body.listingReservation.reservationFromDate), 
            $lt: new Date(req.body.listingReservation.reservationToDate) 
           } 
          } 
         ], 
         $and: [ 
          {'listingReservation.reservationFromDate': {$lte: new Date(req.body.listingReservation.reservationFromDate)}}, 
          {'listingReservation.reservationToDate': {$gte: new Date(req.body.listingReservation.reservationToDate)}} 
         ] 
        }] 
       }, 
        {'listingBasics.listingId': req.body.listingBasics.listingId}, 
        {_id: {$ne: mongojs.ObjectId(req.body._id)}}, 
        {'listingBasics.listingOwner': req.user.username} 
       ] 
      }, 
      { 
       $set: {'listingReservation.reservationStatus': 'rejected'} 
      }) 

ответ

2

Если я понять вопрос правильно, вы ищете запрос, чтобы найти, если какие-либо оговорки совпадают с диапазоном дат, и установите статус этих оговорок до rejected. Стандартный запрос, чтобы сделать это, с точки зрения вашей установки, является

db1.reservationTable.update({ 
     "reservationFromDate" : { "$lte" : new Date(req.body.listingReservation.reservationToDate) },    
     "reservationToDate" : { "$gte" : new Date(req.body.listingReservation.reservationFromDate) } 
    }, 
    { "$set" : { "reservationStatus" : "rejected" } }, 
    { "multi" : true } 
) 

Если мы называем периоды времени испытывается для перекрытия T и S, состояние на простом английском языке, что T начинается до S концов, и T заканчивается после начала S. Если вы подумаете об этом, вы увидите, что это гарантирует, что T и S перекрываются.

+0

Это охватывает все логические базы. Я не уверен, почему я не смог найти эту упрощенную форму запроса. Красиво сделано! – NoOutlet

+0

@Wdberkeley, спасибо тонну, прекрасно работает, так элегантно. –

+0

@NoOulet, спасибо за ваши входы тоже. –

2

Логичный вопрос, чтобы спросить

Есть ли какие-либо оговорки, где:

дата начала раньше req.body.listingReservation.reservationFromDateи дата окончания после req.body.listingReservation.reservationFromDate

или

дата начала, прежде чем req.body.listingReservation.reservationToDateи дата окончания после req.body.listingReservation.reservationToDate

или

дата начала после req.body.listingReservation.reservationFromDateи конец дата предшествует req.body.listingReservation.reservationToDate?

Вот возможный запрос основан на вашем:

db1.reservationTable.update(
    { 
    $or: [ 
     { 
     'listingReservation.reservationFromDate': { 
      $lte: new Date(req.body.listingReservation.reservationFromDate) 
     }, 'listingReservation.reservationToDate': { 
      $gte: new Date(req.body.listingReservation.reservationFromDate) 
     } 
     }, { 
     'listingReservation.reservationFromDate': { 
      $lte: new Date(req.body.listingReservation.reservationToDate) 
     }, 'listingReservation.reservationToDate': { 
      $gte: new Date(req.body.listingReservation.reservationToDate) 
     } 
     }, { 
     'listingReservation.reservationFromDate': { 
      $gte: new Date(req.body.listingReservation.reservationFromDate) 
     }, 'listingReservation.reservationToDate': { 
      $lte: new Date(req.body.listingReservation.reservationToDate) 
     } 
     } 
    ], 
    'listingBasics.listingId': req.body.listingBasics.listingId, 
    _id: {$ne: mongojs.ObjectId(req.body._id)}, 
    'listingBasics.listingOwner': req.user.username 
    }, { 
    $set: {'listingReservation.reservationStatus': 'rejected'} 
    }) 
+0

спасибо за ответ, но одно условие здесь все еще не выполнено, и я ударяю головой, чтобы понять, как это можно включить. Ниже сценария, который я тестировал, мои оговорки выглядят так (начало-конец) - (от 14 до 17), (18-19), (23-25), & (15-20). Принимая (14-17) отклонения (18-19) & (15-20). Принимая (18-19) отклонения (15-20), эти два сценария верны. Но принятие (15-20) только отклоняет (14-17), я хотел бы, чтобы даже (18-19) был отклонен. Это из-за mongodb? потому что, прочитав из вашего логического вопроса, все условия должны быть покрыты. –

+0

P.S: Я проголосовал за ответ, но это еще не полный ответ;) –

+0

Не могли бы вы предоставить фактические данные выборки в вопросе? Простой 'db1.reservationTable.find() 'с любыми чувствительными данными, отредактированными? – NoOutlet

Смежные вопросы