【问题标题】:MongoDB Delete records with date field less than days from another fieldMongoDB从另一个字段中删除日期字段小于天的记录
【发布时间】:2019-10-02 05:57:16
【问题描述】:

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

{
"_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 的新手,所以在这方面有点挣扎。

【问题讨论】:

标签: c# mongodb


【解决方案1】:

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

您必须首先“计算”新字段,然后使用匹配的文档并调用删除运算符,这可以很容易地使用subtracting 从日期开始聚合并匹配具有否定结果的文档.

但是,如果我可以提出一个我个人认为更好的解决方案: 使用TTL index's 这样每个文档都会在它到期时过期,而不必维护一个 cron 删除查询。

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

【讨论】:

  • 就简单性和性能而言,这似乎是最明智的方法。谢谢。
【解决方案2】:

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

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2020-08-11
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多