2017-01-13 13 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という日付を検索することができます。 これは、代替の日付を見つけるのにこの正しい効率的な方法ですか?

Two Day Gapタイプのサブスクリプションを検索する現在の方法は何ですか?

+0

* subscribed_on *の日付部分が 'new Date()。toISOString()'の日付部分と等しいかどうかを確認してください。次に、* type *が "alternate"かどうかを確認します。 UTCベースの日付を使用すると、タイムゾーンのために現地日付との間に明らかな相違が生じることに注意してください。 – RobG

答えて

0

このようなことを試すことができます。すべての計算はUTCで行われます。 typeをチェックして、alternate & Two Day Gapミリ秒を割り当て、$cond$subtractsubscribed_onの違いや、指定した日付を計算し、配信対象とするためにtrueまたはfalseを返すために$eq$condを使用します。

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] 
     } 
    } 
}); 
関連する問題