web-dev-qa-db-ja.com

mongoクエリでISO日付をタイムスタンプに変換する

これがクエリです

[
    { 
        "$project": {
            "formattedDate": { 
                "$dateToString": { "format": "%Y-%m-%d", "date": "$ceatedAt" } 
            },
            "createdAtMonth": { "$month": "$ceatedAt" },
            "rating": 1
        }
    },
    {
         "$group": {
             "_id": "$formattedDate",
             "average": { "$avg": "$rating" },
             "month": { "$first": "$createdAtMonth" },
         }
    }
]

タイムスタンプに日付が必要です。どうやってするか?

6
nirvair

_$subtract_算術集計演算子を日付としてminuendおよびnew Date("1970-01-01") assubtrahend

_db.collection.aggregate(
  {
    $project: { "timestamp": { $subtract: [ "$createdAt", new Date("1970-01-01") ] } } 
  }
);
_

文書用

_{ "_id": 1, "createdAt": ISODate("2016-09-01T14:35:14.952Z") }
_

結果は

_{ "_id": 1, "timestamp": NumberLong("1472740514952") }
_

タイムスタンプと(年、月、日付)の両方でグループ化する場合は、タイムスタンプを1日のミリ秒の長さで除算して、1日ごとに(ミリ秒ごとではなく)一意にすることができます。

_db.collection.aggregate(
  {
    $project: 
      {
        "timestampByDay":
          {
            $floor: 
              {
                $divide: 
                  [ 
                    { $subtract: [ "$createdAt", new Date("1970-01-01") ] }, 
                    24 * 60 * 60 * 1000 
                  ] 
              }
          },
        "date": "$createdAt"
      }
  },
  {
    $group:
      {
        "_id": "$timestampByDay",
        "date": { $first: "$date" }
      }
  }
);
_
13
tarashypka

Mongodb4.0が導入 $toLong 日付をタイムスタンプに変換する集計

db.collection.aggregate([
  { "$project": {
    "createdAt": {
      "$toLong": "$createdAt"
    }
  }}
])

試すことができます ここ

12
Ashh