2016-12-21 9 views
0

クライアントの場所がインドにあるアプリがあります。私のアプリケーションは、クライアントが与えたdaterangeに基づいてデータを集計する必要があります。したがって、クライアントが2016年12月14日から2016年12月2016まで2016年12月14日00:00:00から2112年12月23日23:59:59まで検索する必要があります。 は、今のようにすぐに私は自分のサーバーに自分の日を送ってそれが今、私はクライアント側のインド時間と米国のサーバ日時の日付を処理する方法

次の出力

[ { _id: { date: 17, month: 12, year: 2016 }, count: 2 }, 
    { _id: { date: 16, month: 12, year: 2016 }, count: 2 }, 
    { _id: { date: 13, month: 12, year: 2016 }, count: 2 } ] 

になり

let cursor = Trip.aggregate([{ 
     $match: { 
      startTime: { 
       $gte: startDate.toDate(), 
       $lte: endDate.toDate() 
      }, 
     } 
    },{ 
     $group: { 
      _id: { 
       date: { 
        $dayOfMonth: "$startTime" 
       }, 
       month: { 
        $month: "$startTime" 
       }, 
       year: { 
        $year: "$startTime" 
       } 
      }, 
      count: { 
       $sum: 1 
      } 
     } 
    }]); 

として私集計クエリを記述
Dec 13 2016 18:30:00 GMT+0000 (UTC)
Dec 21 2016 18:29:59 GMT+0000 (UTC)
に変換します実際の旅行時間は

"startTime" : ISODate("2016-12-13T20:10:20.381Z") 
"startTime" : ISODate("2016-12-13T19:54:56.855Z") 
です実際に私はすべてのものが、1時間の範囲内になりたいが、MongoDBのがUTC以外の任意の他の時間帯にデータを格納することはできませんし、別の管理が困難になってきている 14-12-2016 01:40:20am14-12-2016 01:24:56am

に行われた

クライアント側のクエリとデータベースの時間。 解決方法を教えてください。

+0

私が考えることができる1つの解決策は、Epochからのミリ秒単位のタイムスタンプとしてデータを格納することですが、それは役に立ちますか? –

+0

私はあなたがタイムゾーンに関連するロジックをクライアントに保持するべきだと思います。クライアントのタイムゾーンを取得し、UTCのdatetimesをクライアントのタイムゾーンに戻します。私はあなたがそれをしている間に直面している問題はわかりません。 – Veeram

+0

問題はmongodbの集約アルゴリズムです。 'ISODate(" 2016-12-13T20:10:20.381Z ")という日付では、日付は13、12、2016として集計されます。どちらが正しいか。しかし、私が欲しいものではありません。私によれば、あなたが出てきた解決策は、すべてのデータをフロントエンドに持ち込み、そこですべての計算を行うことです。フロントエンドのロジックには、個人的には嫌いなことが増えます。他のアプローチでは、mongodb集約フレームワークを廃止し、自分自身の集計ロジックを日付の上に書くことになります –

答えて

1

次のようにアプローチできます。オフセットミリ秒でレコードを保存することができます。コレクションは以下のようになります。

{ 
    "_id": ObjectId("585a97dcaceaaa5d2254aeb5"), 
    "start_date": ISODate("2016-12-17T00:00:00Z"), 
    "offsetmillis": -19080000 
} { 
    "_id": ObjectId("585a97dcaceaaa5d2254aeb6"), 
    "start_date": ISODate("2016-11-17T00:00:00Z"), 
    "offsetmillis": -19080000 
} { 
    "_id": ObjectId("585a97dcaceaaa5d2254aeb7"), 
    "start_date": ISODate("2016-11-13T00:00:00Z"), 
    "offsetmillis": -19080000 
} 

また、処理中にオフセットミリ秒を含むように集約クエリを更新することができます。

aggregate([{ 
    $match: { 
     start_date: { 
      $gte: new ISODate("2016-01-01"), 
      $lte: new ISODate("2016-12-31") 
     }, 
    } 
}, { 
    $group: { 
     _id: { 
      date: { 
       $dayOfMonth: { 
        $add: ["$start_date", "$offsetmillis"] 
       } 
      }, 
      month: { 
       $month: { 
        $add: ["$start_date", "$offsetmillis"] 
       } 
      }, 
      year: { 
       $year: { 
        $add: ["$start_date", "$offsetmillis"] 
       } 
      } 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}]); 

サンプル応答

{ "_id" : { "date" : 12, "month" : 11, "year" : 2016 }, "count" : 1 } 
{ "_id" : { "date" : 16, "month" : 11, "year" : 2016 }, "count" : 1 } 
{ "_id" : { "date" : 16, "month" : 12, "year" : 2016 }, "count" : 1 } 

あなたはより多くのそれを最適化することができますが、私は、これはあなたのアイデアを与えるだろうと思います。

+0

これは良いようです。それを試してみましょう.. –

+0

魅力のように動作します。ありがとう –

関連する問題