Mongodb - 减去日期
Posted
技术标签:
【中文标题】Mongodb - 减去日期【英文标题】:Mongodb - Substract dates 【发布时间】:2022-01-21 16:42:10 【问题描述】:我有以下数据库
"_id" : 1, "time" : "Nov 26, 2021 14:06:30.092158000"
...
...
"_id" : 9999, "time" : "Nov 27, 2021 12:45:01.134957000" *
我想减去日期 2021 年 11 月 27 日 12:45:01.134957000 - 2021 年 11 月 26 日 14:06:30.092158000(最后日期 - 初始日期)并以秒为单位得到结果。
有什么推荐吗?
【问题讨论】:
从不将日期/时间值存储为字符串,这是设计缺陷!始终存储正确的Date
对象,然后您可以简单地使用$dateSubtract 甚至是普通的-
,它返回以毫秒为单位的差异
感谢推荐,数据集来自导出python的csv文件。对于未来的项目,我将如何从 python 中导出日期?
转换成datetime
【参考方案1】:
这是一个小的更新脚本,用于在 MongoDB 中将那些讨厌的日期字符串转换为漂亮的日期时间:
var mmap = "Jan":"01", "Feb":"02", "Mar":"03", "Apr":"04", "May":"05", "Jun":"06",
"Jul":"07", "Aug":"08", "Sep":"09", "Oct":"10", "Nov":"11", "Dec":"12";
db.foo.find().forEach(function(d)
var zz = d['time'].split(' '); // ['Nov','26,','2021','15:06:30.092158000']
print(zz);
// Turns 4, into 04 and 27, into 27. Sort of like %02d:
var day = ("00" + zz[1].substring(0,zz[1].length-1) ).slice(-2)
var dd = new ISODate(zz[2] + '-' + mmap[zz[0]] + '-'
+ day
+ 'T' + zz[3].substring(0,12) // MongoDB can only store millis
+ 'Z');
// So as not to lose info, let's capture the nanos as an int:
var nanos = new NumberInt(zz[3].substring(9,18));
db.foo.update(_id:d['_id'],$set: "time":dd, "nanos":nanos);
);
一旦你有了真正的约会,一切都会变得简单。这是一种基于某些过滤条件获取一组文档的通用方法,然后获取第一个和最后一个日期并找到差异。
db.foo.aggregate([
// Put $match and other filtering expressions here if desired.
$sort: "time":1 // Get them in order...
// ... and take first and last items!
,$group: _id: null, fd: $first:"$time", ld: $last:"$time"
,$addFields: diff: $subtract: ["$ld","$fd"]
]);
【讨论】:
我宁愿建议库moment.js或类似的库,而不是重新发明***: $set: time: moment(d.time, "MMM DD, YYYY HH:mm:ss.SSS").toDate())
以上是关于Mongodb - 减去日期的主要内容,如果未能解决你的问题,请参考以下文章
转换以字符串格式存储的日期值并减去 mongodb 中的当前日期