【问题标题】:convert iso date to timestamp in mongo query在mongo查询中将iso日期转换为时间戳
【发布时间】:2019-01-18 23:38:09
【问题描述】:

这里是查询

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

我需要时间戳中的日期。该怎么做?

【问题讨论】:

    标签: mongodb date mongodb-query aggregation-framework


    【解决方案1】:

    如果你想更新时间戳。对于当前日期和时间,请使用以下查询。

    db.getCollection('movie').update(
    {"applicationId":"2b5958d9629026491c30b42f2d5256fa8","type":"shortcut"},
    {$set : {userName:"vipin+testkm23052020@applozic.com",created_at: NumberLong(new Date()),"updated_at":NumberLong(new Date()),"docIndex":UUID()}}, {multi:true, upsert: false}
    )
    

    【讨论】:

      【解决方案2】:

      Mongodb 4.0 引入了$toLong 聚合,将日期转换为时间戳

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

      你可以试试here

      【讨论】:

        【解决方案3】:

        使用$subtract 算术聚合运算符,您的日期作为minuend,new Date("1970-01-01") 作为subtrahend。

        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") }
        

        如果您想同时按时间戳和(年、月、日期)分组,您可以将时间戳除以一天中的毫秒数,这样它对于每一天(而不是每一毫秒)都是唯一的

        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" }
              }
          }
        );
        

        【讨论】:

        • 但是,我会得到那个日期的分组数据吗?
        • 否,如果您想按(年、月、日)的值进行分组。您能否在您的问题中提供一些文件和预期结果?
        • 是的,根据输入请求,我将按月、周、日分组。这是我得到的月份和星期的答案 - 它有效:stackoverflow.com/questions/39269760/… 现在,当我按天分组时,我需要显示时间戳而不是日期字符串。
        • 在组中,我是否必须添加_id:timestampByDay?
        • 是的,它将被分组为(年、月、日)是唯一的。但请注意,在结果输出中,您不会得到日期的真实时间戳为_id,但您会得到时间戳除以24 * 60 * 60 * 1000。
        猜你喜欢
        • 2019-09-15
        • 2022-01-10
        • 1970-01-01
        • 2020-11-23
        • 2022-10-15
        • 2019-03-31
        • 2011-04-16
        • 2015-03-25
        相关资源
        最近更新 更多