从MongoDB中的日期获取秒数的5种方法

发布于

本文介绍了 5 种从 MongoDB 中的 Date 对象返回秒部分的方法。

示例数据

假设我们有一个包含以下文档的集合:cats

{ “_id” : 1, “name” : “Scratch”, “born” : ISODate(“2021-01-03T23:30:15.123Z”) } { “_id” : 2, “name” : “Meow”, “born” : ISODate(“2019-12-08T04:00:20.112Z”) } { “_id” : 3, “name” : “Fluffy”, “born” : ISODate(“2020-09-24T10:45:01.007Z”) }

以下示例演示了从这些文档的字段返回秒部分的各种选项。born

运营商$second

该运算符专门设计用于返回包含给定日期的秒部分的文档。[$second](https://database.guide/mongodb-second/ "MongoDB $second")

我们可以运行以下代码从上述文档中的字段中返回秒部分。born

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthSecond: { $second: "$born" }
        }
    }
  ]
)

结果:

{ “birthSecond” : 15 } { “birthSecond” : 20 } { “birthSecond” : 1 }

您还可以在使用运算符时指定时区。$second

请参阅 MongoDB $second 了解更多信息和示例。

运营商$dateToString

运算符根据用户指定的格式将日期对象转换为字符串。因此,用户可以指定在需要时仅返回秒部分。[$dateToString](https://database.guide/mongodb-datetostring/ "MongoDB $dateToString")

每个日期部分都有格式说明符。格式说明符返回第二部分(2 位数字,零填充)。%S

例:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthSecond: { $dateToString: { format: "%S", date: "$born" } }
       }
     }
   ]
)

结果:

{ “birthSecond” : “15” } { “birthSecond” : “20” } { “birthSecond” : “01” }

请参阅 MongoDB $dateToString 了解更多信息和示例。

运营商$dateToParts

运算符返回一个文档,其中包含给定 BSON Date 值的组成部分作为单个属性。返回的属性为 、、、、 和 。[$dateToParts](https://database.guide/mongodb-datetoparts/ "MongoDB $dateToParts")``year``month``day``hour``minute``second``millisecond

因此,我们可以在一个管道阶段中使用,然后添加另一个提取零件的管道阶段。$dateToParts``second

以下是我们三个文档的回报:$dateToParts

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

结果:

{ “dateParts” : { “year” : 2021, “month” : 1, “day” : 3, “hour” : 23, “minute” : 30, “second” : 15, “millisecond” : 123 } } { “dateParts” : { “year” : 2019, “month” : 12, “day” : 8, “hour” : 4, “minute” : 0, “second” : 20, “millisecond” : 112 } } { “dateParts” : { “year” : 2020, “month” : 9, “day” : 24, “hour” : 10, “minute” : 45, “second” : 1, “millisecond” : 7 } }

然后,可以将此结果传递到管道中的下一阶段,因此我们可以在下一阶段仅提取字段。second

如果我们只为字段添加另一个投影,会发生什么情况:second

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthSecond: "$dateParts.second"
        }
    }
  ]
)

结果:

{ “birthSecond” : 15 } { “birthSecond” : 20 } { “birthSecond” : 1 }

因此,无论何时在管道中使用,都可以在下一阶段访问该字段(和其他日期部分)。$dateToParts``second

请参阅 MongoDB $dateToParts 了解更多信息和示例。

方法forEach()

您可以使用 JavaScript 方法(如 或)循环访问光标,以仅返回秒数。[cursor.forEach()](https://database.guide/mongodb-foreach/ "MongoDB forEach()")``getSeconds()``getUTCSeconds()

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getUTCSeconds()
      );
  }
);

结果:

15 20 1

JavaScript 方法返回一个介于 0 和 59 之间的整数,表示根据通用时间在给定日期中的秒数。getUTCSeconds()

该方法以本地时间返回它。getSeconds()

您可能还会注意到,前面的选项返回包含名称/值对的整个文档,而此选项仅返回实际的秒值,而不是整个文档。

方法map()

该方法将函数应用于游标访问的每个文档,并将值合并到一个数组中。[cursor.map()](https://database.guide/mongodb-map/ "MongoDB map()")

例:

db.cats.find().map(
  function(c) {
    c = c.born.getUTCSeconds();
    return c;
  }
);

结果:

[ 15, 20, 1 ]