【问题标题】:MongoDB aggregation : get day, month and year from date/timestamp in arrayMongoDB聚合:从数组中的日期/时间戳获取日、月和年
【发布时间】:2020-06-19 00:59:18
【问题描述】:

这种语法是查找任何对象“gt”日期或两个带有“lt”的日期之间,所以我这样做:

db.compte.aggregate([
  {
    $project: {
      time: {
        $filter: {
          input: "$auditMessages",
          as: "auditMessages",
          cond: {
            $and: [
              {
                $gt: ["$$auditMessages.timestamp", "2020-05-20T07:18:42.115Z"]
              }
            ]
          }
        }
      }
    }
  }
]);

这是结果,它有效:

{
  _id: ObjectId"5ed638e566a699750cbb1b0f"),
  time: [
    {
      eventCategory: "Audit",
      objectType: "Audit Log",
      eventAction: "Query",
      status: "Initiated",
      username: "Unknown",
      userId: "Unknown",
      timestamp: "2020-05-20T07:19:05.149Z",
      eventDescription: "Querying without filters."
    },
    {
      eventCategory: "Audit",
      objectType: "Audit Log",
      eventAction: "Query",
      status: "Successful",
      username: "Unknown",
      userId: "Unknown",
      timestamp: "2020-05-20T07:18:42.232Z",
      eventDescription: "Querying without filters."
    }
  ]
}

现在我想查找日、月和年,例如我想要这样的时间戳: 年份:2020 月:05 天数:20 小时:07 分钟:18 和毫秒:42

提前谢谢你。

【问题讨论】:

    标签: arrays mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您只需要聚合运算符$dateToParts

    作为您的日期字段,即; timestamp 在一个数组中,我们正在使用 $map 进行迭代,并将所有字段 yearmonthhourminute 等合并到实际对象并将对象推回@987654331 @数组。

    db.collection.aggregate([
      {
        $addFields: {
          time: {
            $map: {
              input: "$time",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
                    $dateToParts: {
                      date: "$$this.timestamp"
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    测试: mongoplayground

    注意:

    如果您的 timestamp 字段是一个字符串,那么您需要使用 $dateFromString 运算符将其转换为日期。检查这个:mongoplayground

    变化即将到来:

     {
        $dateToParts: {
             date: {
               $dateFromString: {
                   dateString: "$$this.timestamp"
                }
             }
          }
       }
    

    【讨论】:

    • 请给我我测试的所有语法,它对我不起作用,时间戳的类型是字符串
    • @m1h3r : 你所说的所有语法都不起作用是什么意思?
    • @whoami 我测试了这个 db.collection.aggregate([ { $addFields: { time: { $map: { input: "$time", in: { $mergeObjects: [ "$$this ", { $dateToParts: {date: "$$this.timestamp" } } ]} } } }}])但它不起作用
    • @m1h3r :正如我已经说过的字符串格式的日期,您需要使用第二个!检查 Note 中的游乐场链接
    • 我在 Robo 3T 中测试的结果相同,但不起作用
    猜你喜欢
    • 2013-07-26
    • 2012-03-17
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多