2017-01-13 2 views
1

Я должен реализовать подписку, в которой пользователи могут подписаться на свои продукты, которые будут доставлены ему по каждому alternate с даты его подписания или с Two Day Gap с указанной даты.Если текущая дата является альтернативной датой

//Sample Data 
[ 
    { 
     "subscribed_on": ISODate("2017-01-01T08:15:39.736Z"), 
     "_id" : 1, 
     "customer" : "jon doe", 
     "type": "alternate" 
    }, 
    { 
     "subscribed_on": ISODate("2017-01-02T08:15:39.736Z"), 
     "_id" : 1, 
     "customer" : "Doe John", 
     "type": "Two Day Gap" 
    }, 
    { 
     subscribed_on: ISODate("2017-01-02T08:15:39.736Z"), 
     "_id" : 1, 
     "customer" : "Foo Name", 
     "type": "alternate" 
    } 
] 

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

Как я могу суммировать, чтобы подсчитать, является ли текущая дата alternate или находится в two-day gap?

Чтобы упростить запрос для альтернативного варианта, я могу проверить, является ли текущая дата even or odd и будет запрашивать дату, противоположную ей. Например, если текущая дата равна 1st Jan, то есть odd Я могу запросить, чтобы найти дату, которая является even для alternate подписного запроса. Это правильный эффективный способ поиска альтернативной даты?

Каким будет текущий способ найти подписку на Two Day Gap?

+0

Вы можете перебрать массив и посмотреть, совпадает ли элемент даты * signed_on * с частью даты 'new Date(). ToISOString()'. Затем проверьте, является ли * тип * «альтернативным» или нет. Обратите внимание, что использование дат, основанных на UTC, может иметь явные расхождения с местными датами из-за часовых поясов. – RobG

ответ

0

Вы можете попробовать что-то вроде этого. Все расчеты проводятся в формате UTC. Использование $cond с $eq проверить type и назначить alternate & Two Day Gap миллисекунды, а затем $cond$subtract с, чтобы вычислить разницу между subscribed_on и заданной датой и возвращает true или false для доставки права.

db.subscription.aggregate({ 
    $project: { 
     customer: 1, 
     type: 1, 
     readyForDelivery: { 
      $cond: [{ 
       $lte: [{ 
        $subtract: [new ISODate("2017-01-02"), "$subscribed_on"] 
       }, { 
        $cond: [{ 
         $eq: ["$type", "alternate"] 
        }, 86400000, 86400000 * 2] 
       }] 
      }, true, false] 
     } 
    } 
}); 
Смежные вопросы