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 中的当前日期

如何在mongoDB中获取日期差异?日期应该是天数的差异?

如何使用聚合管道从 mongodb 中的当前字段中减去更新?

如何在对象内部排序并减去MongoDB中对象内部的值

如何在mongodb中使用$减去$ inc的文档

MongoDB:如何在 3.6 mongoDb 版本中解析日期?