如何将字符串转换为日期,按日期进行比较并在MongoDB中删除结果?

问题描述 投票:0回答:1

我目前正在尝试在MongoDB查询中执行以下步骤:在下面的图片中有commitDate或commitDate即时。

1-我想将此commitDate转换为日期格式

2-我想将此commitDate与给定日期进行比较,例如:{$ match:{date:{$ lte:date,$ gte:date}}}]

3-我要删除结果。

我知道有聚合管道函数$ dateToString,但是我不知道如何比较和删除范围内的文档。

enter image description here

mongodb mongodb-query spring-data-mongodb
1个回答
1
投票

如果您使用的是MongoDB 3.6版或更高版本,我建议使用$dateFromString运算符将数据库中的字符串转换为比较之前的日期值。与尝试对字符串进行比较相比,它将使比较更加准确(以防出现错误值,例如“ 2020-13”大于“ 2020-01”)。

如果使用的是4.0版或更高版本,则可以执行以下操作。请注意,$ dateFromString操作将使那些不能转换的日期成为空值,因此$ match运算符将不将它们匹配。

db.myCollection.aggregate([
  {
    $project: 
      {
        date2:{
          $dateFromString: {
              dateString: '$date',
              onError: null
          }
        }
      }
  },
  {
    $match: {
      date2:   {
        $gte: ISODate('2020-03-01T00:00:00.000'),
        $lte: ISODate('2020-05-01T00:00:00.000')
      }
    }
  }
]).forEach(doc=> {
  db.dated.deleteOne({_id: doc._id});
  print(doc._id);
});

如果您使用的版本低于3.6但低于4.0,则$ dateFromString运算符中没有onError参数。因此,如果您需要在该字段中考虑非日期值,则必须在转换之前将其过滤掉。这是一个通过正则表达式匹配日期的聚合管道。根据字段的日期格式,可能必须更改正则表达式。 (如果没有数据问题,则不必担心第一个$ match操作。)

db.myCollection.aggregate([
  {
    $match: {
     date: {$regex: /(\d{4})-(\d{2})-(\d{2})T(\d{2})\:(\d{2})\:(\d{2})\.\d{3}/} 
    }  
  },
  {
    $project: 
      {
        date2:{
          $dateFromString: {
              dateString: '$date'
          }
        }
      }
  },
  {
    $match: {
      date2:   {
        $gte: ISODate('2020-03-01T00:00:00.000'),
        $lte: ISODate('2020-05-01T00:00:00.000')
      }
    }
  }
]).forEach(doc=> {
  db.dated.deleteOne({_id: doc._id});
  print(doc._id);
});
© www.soinside.com 2019 - 2024. All rights reserved.