我需要使用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的限制,当前无法升级。
任何帮助将不胜感激。
答案 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
}
大概,您的用户不希望毫秒数有所不同。您可以使用momentjs将timeToGo
转换为人类可读的内容。
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>