我目前正在尝试在MongoDB查询中执行以下步骤:在下面的图片中有commitDate或commitDate即时。
1-我想将此commitDate转换为日期格式
2-我想将此commitDate与给定日期进行比较,例如:{$ match:{date:{$ lte:date,$ gte:date}}}]
3-我要删除结果。
我知道有聚合管道函数$ dateToString,但是我不知道如何比较和删除范围内的文档。
如果您使用的是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);
});