【问题标题】:Mongodb - Substract datesMongodb - 减去日期
【发布时间】: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

标签: mongodb date nosql subtraction


【解决方案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()) } }
猜你喜欢
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2012-08-21
  • 1970-01-01
  • 2018-04-30
  • 2011-05-09
相关资源
最近更新 更多