如何在MongoDB的聚合管道中获取当前时间戳?

时间:2019-03-31 20:57:19

标签: node.js mongodb

我需要使用MongoDB的汇总查询功能对数据中的日期进行一些算术运算。

我的主要问题是获取当前日期并将其从集合中设置的日期值中减去。

示例记录:

[
 {
   _id: '1',
   upcomingDate: ISODate('2019-12-31T23:59:00.000Z')
 }
]

我的管道:

[
{ "$match": { ... },
{ "$project: { 
    timeToGo: { "$subtract": ["$upcomingDate", new Date()] }
  } 
}
]

不幸的是,new Date()导致错误:

MongoError: cant $subtract a String from a Date

我最初的想法是,$upcomingDate被读为string,a,将值设置为[new Date(), new Date()]会导致此错误:

MongoError: cant $subtract a String from a String

我正在使用Node.js编写查询,我们的数据库是WiredTiger v3.2,由于我们的提供商MLabs的限制,当前无法升级。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

MongoDB的$subtract运算符支持将JS Date对象和包裹在ISODate()中的日期组合在一起。

给出MongoDB 文档

{
    "_id" : ObjectId("5ca61f0f1c9d440000095b93"),
    "upcomingDate" : ISODate("2019-04-11T00:00:00.000-07:00")
}

使用查询,您还有时间:

const now = new Date();

db.stackx.aggregate([
  {
    $addFields: {
      timeToGo: { $subtract: ["$upcomingDate", now] }
    }
  }
]);
在此示例中使用了

$addFields,因此结果显示了原始日期和时差(以毫秒为单位)。

{
    "_id" : ObjectId("5ca61f0f1c9d440000095b93"),
    "upcomingDate" : ISODate("2019-04-11T00:00:00.000-07:00"),
    "timeToGo" : 574038669
}

大概,您的用户不希望毫秒数有所不同。您可以使用momentjstimeToGo转换为人类可读的内容。

const duration = moment.duration(574038669, 'milliseconds');
const days = duration.asDays();
console.log(days + ' days remaining.');
<script src="https://rawgit.com/moment/moment/2.2.1/min/moment.min.js"></script>