2014-11-19 5 views
0

У меня проблема с часовым поясом MongoDB - это UTC. Я искал решения из многих других существующих проблем, но он все еще не работает. Мой код следующим образом:MongoDB aggregate Часовой пояс на дату добавить

MongoDB версия: 2,2

данных

{ "_id" : ObjectId("52a3c9df46c6a9627eeb0337"), "Counting" : { "id" : "b1a93dfda46c47848f9862031300d24c", "group" : "Salary", "user_id" : "4d4ad2d37a464ad09d9aca2fee4c760c", "subGroup" : "e–ae3?", "bank_id" : "97e0fecc322b49b48c4eb3c8425fea77", "fee" : 646, "isIncome" : "true", "payment" : "", "consumeDate" : ISODate("2013-08-15T16:00:00Z"), "createDate" : ISODate("2013-12-08T01:22:39.008Z"), "bank_name" : "9edb6897-cdb8-4ce4-8f08-f5792cfa83d9" } } 

{ "_id" : ObjectId("52a3c9df46c6a9627eeb0338"), "Counting" : { "id" : "33b341fc71314daebe851397c5cbaa40", "group" : "Salary", "user_id" : "cb9e06649cf943e5b368f6b05fc126c6", "subGroup" : "e–ae3?", "bank_id" : "e8da8cdae3ae495ca76f873fb3460b6d", "fee" : 647, "isIncome" : "true", "payment" : "", "consumeDate" : ISODate("2013-02-28T16:00:00Z"), "createDate" : ISODate("2013-12-08T01:22:39.016Z"), "bank_name" : "6913b48a-1a95-48c5-81f5-6920031358d7"} } 

{ "_id" : ObjectId("52a3c9df46c6a9627eeb033a"), "Counting" : { "id" : "f0d41ed9f29f47e7b68a05c378cf939d", "group" : "Salary", "user_id" : "847cadbf55f84615af3ee63922446b54", "subGroup" : "e–ae3?", "bank_id" : "f45d62b5e62f4b7fa8172870cd992f19", "fee" : 623, "isIncome" : "true", "payment" : "", "consumeDate" : ISODate("2013-04-18T16:00:00Z"), "createDate" : ISODate("2013-12-08T01:22:39.152Z"), "bank_name" : "30dd169e-723e-4748-93cd-2d7a45b4a3b7"} } 


db.Product.aggregate([{ 
"$group": { 
    "_id": { 
     "tyear": { 
     "$year": [{ 
      "$add": ["$Counting.consumeDate", 28800000] 
     }] 
     }, 
     "tMonth": { 
      "$month": [{ 
       "$add": ["$Counting.consumeDate", 28800000] 
      }] 
     }, 
     "tDate": { 
      "$dayOfMonth": [{ 
       "$add": ["$Counting.consumeDate", 28800000] 
      }] 
     }, 
    }, 
    "count": { 
     "$sum": "$Counting.fee" 
    } 
} }]) 

Сообщение об ошибке:

"errmsg" : "exception: $add does not support dates" 

Ссылка How to agregate by year-month-day on a different timezone

ответ

1

Я рекомендую делать это в двух -ступят как проект, а затем группа.

var millisecondsFromUTC = 8 * 60 * 60 * 1000; //PST is -8 hours from UTC 

db.Product.aggregate([ 
    { $project : { 
     consumeDateLocal: { 
      $subtract : [ "$Counting.consumeDate", millisecondsFromUTC ] 
     }, 
     fee: '$Counting.fee" } }, 
    { $group: { 
     _id: { 
      "tyear": { $year: "$consumeDateLocal" }, 
      "tMonth": { "$month": "$consumeDateLocal" },     
      "tDate": { "$dayOfMonth": "consumeDateLocal" } 
     }, 
     count: { 
      $sum: "$fee" 
     } 
    } } ], ...); 
0

Я делаю это так.

millisecondsFromUTC = 8 * 3600 * 1000 
Db.collection.aggreagte([ 
    {$match: query}, 
    { 
    $group: { 
    _id: { 
     $dateToString: { 
     format: "%Y-%m-%d", 
     date: {$add: ["$date", millisecondsFromUTC]} 
    }, 
    click: {$sum: '$click'}, 
    money: {$sum: {$divide: ['$money', 10000]}}, 
    pv: {$sum: '$pv'}, 
    req: {$sum: '$req'}, 
    date: {$last: '$date'} 
    } 
}]