MongoDB 从另一个字段中删除日期字段小于天的记录



我有一个集合,它将应用程序日志存储在文档中:

{
"_id" : ObjectId("5d92d5d01518a620ccaf015c"),
"MessageType" : "ApplocationLog",
"FireAndForget" : true,
"CreatedTimestamp" : ISODate("2019-10-01T06:28:00.198+01:00"),
"OriginReference" : "OriginReference",
"OriginName" : "OriginName",
"LogMessage" : "The log message",
"RetentionDays" : 1,
"LogSeverity" : "Error",
"ApplicationUserContextId" : "User1",
"ApplicationUserContextName" : "User1Name",
"Exception" : null,
"ErrorRelatedObjects" : null
}

我需要运行一个查询来删除集合中当前系统日期减去"保留天数"大于文档的"创建时间戳"的所有记录,即删除过期的日志文档。

我正在我的应用程序中使用MongoDB C#驱动程序,并试图找出执行此操作的最佳方法。我考虑过在插入文档时添加到期日期,事后看来这可能会让事情变得更容易?但我仍然需要使用查询来处理现有记录。

我还没有走多远,但开始尝试制定查找所有已过期记录的标准:

db.ApplicationLog.find({
"CreatedTimestamp": {
$gte: 
new Date(new Date().setDate(new Date().getDate()-1))
}

}(

如果我能减去上面的"保留天数"而不是硬编码的 1,也许我可以将其添加到删除查询的条件中?我是MongoDB的新手,所以在这方面有点挣扎。

坏消息是你不能在一个查询中做到这一点。

您必须首先"计算"新字段,然后使用匹配的文档并调用 remove 运算符,这可以通过从日期中减去并匹配具有负结果的文档来使用聚合相当容易地完成。

但是,如果我可以提出一个解决方案,我个人觉得更好: 以这种方式使用 TTL 索引,每个文档都将在到期时过期,而不必维护 cron'd 删除查询。

下面是可用作参考的"动态"TTL 索引的示例。

一种解决方案是聚合ApplicationLog并过滤需要保留的文档。最后,将现有数据替换为聚合的输出。

例如:

db.ApplicationLog.aggregate([
{
$match:{
$expr:{
$gt:[
"$CreatedTimestamp",
{
$toDate:{
$subtract:[
new Date(),
{
$multiply:[
"$RetentionDays",
86400000
]
}
]
}
}
]
}
}
},
{
$out:"ApplicationLog"
}
])

最新更新