如何在字符串字段中使用日期条件删除mongodb中的文档?

时间:2019-03-27 12:16:58

标签: mongodb

我想要drop documents的{​​{1}} 请参阅样本文档

less than 60 days.

日期字段 StartRunTime 是字符串。

如何使用{ "_id" : ObjectId("5c4abd3e29cb6d223043c036"), "UniqueStoryID" : "4018-1548377034", "LastUpdated" : 148401982, "StartRunTime" : "01/25/2019 00:43:54" } 进行查询?

3 个答案:

答案 0 :(得分:0)

您可以使用TTL indexes让mongodb为您完成此任务。或将StartRunTime存储为日期而不是字符串。比起您可以用$ lte进行查询。

答案 1 :(得分:0)

将日期存储在datetime对象中,而不是字符串中。如果您将日期存储在字符串中,则只会进行字典比较,请相信我,您不希望这样做。始终存储为日期时间对象。

回到问题(假设日期在datetime对象中)

old_date = current_date - 60days
<Collection>.delete_many({StartRunTime: {'$lt': old_date}})

或者您可以使用MongoDB TTL Indexes,它将在60天后自动删除文档(您必须对其进行配置),并且您不必将StartRunTime存储为日期时间对象,则可以保留其值任何你想要的。

答案 2 :(得分:0)

您可以使用$where运算符(接受JS函数)来完成此操作:

db.collection.deleteMany({
    $where: function () {
        var date = new Date(this.StartRunTime);
        return Math.round((Date.now() - date.valueOf()) / (1000 * 60 * 60 * 24)) > 60;
    }
})

注意:

  1. 我们将时差除以1000 * 60 * 60 * 24,因为它是毫秒,并且您想计算天数。
  2. 如果您没有在日期字符串中将时区传递给new Date(...),它将在计算机的本地时区中进行解析。如果希望将其解析为GMT,则可以在日期字符串的末尾连接GMT,例如:new Date(this.StartRunTime + " GMT")

重要说明$where运算符无法使用索引,因此可能会导致性能下降。我只是建议这种解决方案,因为它可以回答您的问题。我认为更好的解决方案是将日期存储为正确的日期类型。