【问题标题】:Adding/Subtracting days to ISODate in MongoDB Shell在 MongoDB Shell 中向 ISODate 添加/减去天数
【发布时间】:2015-09-08 21:28:41
【问题描述】:

我有一个查询,我需要获取特定日期前后一天的事件。我需要为该 ISODate 变量增加或减少一天。这是我的查询:

db.event.find().forEach( function (x) {

  print("x : " + x.EventID + ", " + x.ISODate); 
  db.events.find( {
   "$or" : [{
       "StartDate" : { "$gte" : x.ISODate } // Here i need to subtract one day
       }, {
           "EndDate": { "$lt" : x.ISODate} // Here i need to add one day
           }]
}).forEach(function(otherDay) {
        print("x.EventID : " + x.EventID + ", other.Date : " + otherDay.StartDate + " - " + otherDay.EndDate);
      });

});

如何在 mongodb shell 中为 ISODate 变量添加或减去天数?

【问题讨论】:

  • 在这里帮助我理解您的查询:您想查找StartDate 大于或等于特定日期的事件,例如ISODate("2015-06-21T23:59:59.999Z")EndDate 小于@987654325 @?
  • 我想获取开始日期和结束日期之间的事件。我猜这个问题是错误的,我编辑了。我想从 startdate 中减去并添加到 enddate。

标签: mongodb shell


【解决方案1】:

这个问题已经在Query to get last X minutes data with Mongodb回复

query = {
    timestamp: { // 18 minutes ago (from now)
        $gt: new Date(ISODate().getTime() - 1000 * 60 * 18)
    }
}

在你的情况下,持续几天:

"StartDate" : { "$gte" : new Date(ISODate().getTime() - 1000 * 3600 * 24 * 3) }

"StartDate" : { "$gte" : new Date(ISODate().getTime() - 1000 * 86400 * 3) }

(这里 3 是您的天数)

【讨论】:

  • 你能解释一下所有这些数字吗?什么是 1000 和 86400。
  • 嗨,是的,86400 是 3600 秒(1 小时)乘 24(小时),所以它是一天中的秒数。 1000 以毫秒为单位匹配 JS 日期格式
  • 这是否正确处理日光变化等?如果是凌晨 1:59 而今天(比如 X 月的第 22 天),我们会从凌晨 2:00 跳到凌晨 3:00,new Date(ISODate().getTime() + 1000 * 86400 * 1) 给我一个 X 月第 23 天的日期,或者它会跳到月初的第 24 天X?当我们说“增加一天”时,我们并不一定意味着增加 24 小时,而是将天数增加一。如果夏令时更改,那一天的时间可能多于或少于 24 小时,所以这个答案似乎完全被打破了。
  • @Racer SQL 我们使用毫秒,所以要获得一秒,您必须将它乘以 1000
  • 你的答案是3 days minus now。当 OP 想要从 ISODate 中添加或减去天数时,他可以在开始日期和结束日期之间进行查询。
【解决方案2】:

不是一个确切的答案,但相关。

我需要为我的 MongoDB 集合中的所有项目增加一个日期字段,相对于存储的日期值。

下面的查询会将1天添加到myCollection中的myDateField

db.myCollection.find().snapshot().forEach(
    function (elem) {

        const dateDiffInMs = 1 * 24 * 60 * 60000

        db.myCollection.update(
            {
                _id: elem._id
            },
            {
                $set: {
                    myDateField: new Date(elem.myDateField.getTime() + dateDiffInMs)
                }
            }
        );
    }
);

1 day = 1 * 24 * 60 * 60000 = 1 x 24 hours x 60 minutes x 60 seconds x 1000 milliseconds
  • 如果您需要及时减去/返回,请为 dateDiffInMs 使用负值。

【讨论】:

    【解决方案3】:

    我觉得你的问题被误解了。

    我希望您需要在查询中减去一天并添加一天,您可以这样做:{$subtract : [x.ISODate,(1 * 24 * 60 * 60 * 1000)]}

    db.event.find().forEach( function (x) {
    
      print("x : " + x.EventID + ", " + x.ISODate); 
      db.events.find( {
       "$or" : [{
           "StartDate" : { "$gte" : {$subtract : [x.ISODate,(1 * 24 * 60 * 60 * 1000)]} } // Here i need to subtract one day
           }, {
               "EndDate": { "$lt" : {$subtract : [x.ISODate,(-1 * 24 * 60 * 60 * 1000)]}} // Here i need to add one day
               }]
    }).forEach(function(otherDay) {
            print("x.EventID : " + x.EventID + ", other.Date : " + otherDay.StartDate + " - " + otherDay.EndDate);
          });
    
    });
    

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2012-11-12
      • 2011-01-16
      • 2011-01-21
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多