在MongoDB Shell中添加/减去ISODate的天数

在MongoDB Shell中添加/减去ISODate的天数,mongodb,shell,Mongodb,Shell,我有一个查询,需要从中获取特定日期前一天或后一天的事件。我需要给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

我有一个查询,需要从中获取特定日期前一天或后一天的事件。我需要给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" : { "$gte" : new Date(ISODate().getTime() - 1000 * 3600 * 24 * 3) }

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

(这里的3是你的天数)

不是确切的答案,而是相关的

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

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


  • 如果需要减去/返回时间,请对dateDiffInMs使用减号

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

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


      请帮助我理解您的查询:您想查找
      开始日期大于或等于特定日期的事件,例如
      ISODate(“2015-06-21T23:59:59.999Z”)
      结束日期
      小于
      ISODate(“2015-06-21T00:00:00.000Z”)
      ?我想获取开始日期和结束日期之间的事件。我猜问题是错的,我编辑了。我想从开始日期减去结束日期。你能解释一下这些数字吗?1000和86400是多少。嗨,是的,86400是3600秒(1小时)乘24小时,所以它是一天中的秒数。1000是以毫秒为单位来匹配JS日期格式这能正确处理日光变化等吗?如果是凌晨1:59,今天(比如X月22日)我们从凌晨2:00跳到凌晨3:00,我们将
      新的日期(ISODate().getTime()+1000*86400*1)
      给我X月23日的日期,还是跳到X月24日的开始?当我们说“增加一天”时,我们不一定意味着增加24小时,而是将一天增加一天。如果当天的夏令时变化可能超过或少于24小时,因此此答案似乎完全不正确。@Racer SQL我们使用毫秒计算,因此要获得一秒钟,您必须将其乘以1000。您的答案为
      3天减去现在的
      。因为OP希望从ISODate中增加或减少天数,所以他可以在开始日期和结束日期之间进行查询。
      
      "StartDate" : { "$gte" : new Date(ISODate().getTime() - 1000 * 86400 * 3) }
      
      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
      
      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);
            });
      
      });