2016-12-03 3 views
0

私はmeteorhacksを使用しています:流星の集計パッケージを、と私は間の日付範囲内のイベント見つけようとしている:Meteor MongoDB:収集範囲から計算された終了日と日付範囲を集計する方法は?

  • 、マイナス一日を。
  • イベントの終了日と2週間。

問題は、終了日がイベント文書のtimes.untilのフィールドに格納されるという問題です。イベント文書には、次のようになります。

// Event collection doc: 
{ 
    _id: 'abc', 
    times: { 
    start: { 
     dateTime: "ISODate("2017-03-07T00:00:00Z"), 
     timeZone : "America/Chicago" 
    }, 
    until: "20170307T000000Z" 
    } 
} 

私ができる範囲内の日付を見つけるために集約することが、私はイベントのtimes.untilフィールドに基づいてレンジの終了日を計算する方法を見つけ出すことはできません。また

if (Meteor.isServer) { 
    Meteor.methods({ 
    'events.inProgress'() { 
     const start = moment().utc().subtract(1, 'day').toDate(); 

     return Events.aggregate([ 
     {$match: {"times.start.dateTime": {$gt: start, $lt: end**(MUST COMPUTE end FROM DOC'S times.until PLUS 2 WEEKS)**}}}, 
     ]); 
    } 
    } 
} 

times.untilフィールドのフォーマットに注意してください(この形式の正しい名前をわからない)20170307T000000Zです。これはJavaScript Dateの有効な形式ではありませんが、moment.jsはこの文字列を問題なく処理します。 times.untilフィールドへのアクセスでは、私が行うことができます。

const end = moment(event.times.until).add(2, 'week').toDate(); 

は、これは私の範囲の正しい終了日を与えるんが、パイプラインを構築しながら、どのように私は、終了日を計算するためにtimes.untilフィールドをつかむことができますか?

+0

集計を行う前に 'times.until'を有効な日付オブジェクトに更新できますか?パイプラインで 'times.until'に対応する新しい日付オブジェクトを構築することはほとんど不可能です。 – Khang

+0

@Khangはい、mongoに保存する前にラップすることができました。モーメント(until).toDate()を使用しています。 – asking

+1

これはあなたがすべきことです、 'until'フィールドのフォーマットもこれですhttps://en.wikipedia.org/wiki/ISO_8601 – Khang

答えて

1

使用$addしたい日付を取得するためにミリ秒を追加します。もちろん、これはtimes.until はmongoの日付の種類を意味します。

aggregate([{ 
    $match: { 
     "times.start.dateTime": { 
      $gt: start, 
      $lt: { 
       $add: ["$times.until", 14 * 24 * 60 * 60000] 
      } 
     } 
    } 
}]) 
+0

これはうまくいくとは思わない、' until'フィールドのようです文字列 – Khang

+2

はい、それは私が答えで言及した理由です。日付は – Veeram

+0

です。ありがとう@Khang、私は間違っていました。私が実際に望んでいたのは( '" times.until "' + 2 weeks)イベントの2週間延長。 @Veeramが投稿した '$ add'ソリューションを使って計算された日付を作成するために' $ project'を使って解決しました。計算された日付は '$ match'に渡され、' now'と比較されます。 '$ redact'でこれを行うもっと効率的な方法があります。私はそれを理解しようとします。 – asking

関連する問題