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

C# MongoDB从另一个字段中删除日期字段小于天的记录,c#,mongodb,C#,Mongodb,我有一个在文档中存储应用程序日志的集合: { "_id" : ObjectId("5d92d5d01518a620ccaf015c"), "MessageType" : "ApplocationLog", "FireAndForget" : true, "CreatedTimestamp" : ISODate("2019-10-01T06:28:00.198+01:00"), "OriginReference" : "OriginReference", "OriginName" : "Origi

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

{
"_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
}
我需要运行一个查询来删除集合中当前系统日期减去“RetentionDays”大于文档“CreatedTimestamp”的所有记录,即删除过期的日志文档

我正在应用程序中使用MongoDB C#驱动程序,并试图找到实现这一点的最佳方法。我曾考虑在插入文件时添加一个有效期,事后看来,这可能会使事情变得更容易?但我仍然需要使用查询来处理现有记录

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

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


如果我可以减去‘RetentionDays’,而不是上面硬编码的1,那么我可以将其添加到删除查询的条件中吗?我是MongoDB的新手,所以在这方面有点困难。

坏消息是,您不能在一个查询中真正做到这一点

您必须首先“计算”新字段,然后使用匹配的文档并调用移除运算符,这可以相当容易地使用从日期开始的聚合和匹配结果为负的文档来完成

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


下面是一个“动态”TTL索引的示例,您可以将其用作参考。

坏消息是您不能在一个查询中真正做到这一点

您必须首先“计算”新字段,然后使用匹配的文档并调用移除运算符,这可以相当容易地使用从日期开始的聚合和匹配结果为负的文档来完成

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


这里是一个“动态”TTL索引的示例,您可以将其用作参考。

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

例如:

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

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

例如:

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

组合和可能?组合和可能?就简单性和性能而言,这似乎是最明智的方法。谢谢。就简单性和性能而言,这似乎是最明智的方法。非常感谢。