【问题标题】:Auto-Delete Certain type of Document in Mongodb in collection在集合中自动删除 Mongodb 中的某些类型的文档
【发布时间】:2021-03-17 14:59:18
【问题描述】:

我有一个名为PeopleDocument 的集合。此集合包含三种不同类型的文件:IDCardCopytaxCopyPermitCopy。用户可以上传任何这些文件。我想在上传一年后自动删除IDCardCopy。我正在查看 MongoDB TTL,但是我有一些问题:

db.PeopleDocument.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 31622400} ) 

如果我创建一个像上面那样的索引,我认为它会在 1 年后删除 PeopleDocument 中的所有文件,是否可以只删除 IDCardCopy

更多细节:

这是我用来插入文档的 C# 代码:

var collInternDocuments = _database.GetCollection<BsonDocument>("PPLDocuments");



var doc = new BsonDocument{
                             {"Documentid", strDocumentID},
                             { "FileType", typeOfDocument},                                        
                             { "FileContent", file.ContentType},
                             { "FileName", file.FileName},
                             { "UploadTime", DateTime.Now},
                             { "UploadedBy", uploadedBy},
                             { "GridFSFileID", strGridFSFileID}
                           };
    

collInternDocuments.UpdateOne( Builders<BsonDocument>.Filter.Eq("_id", internUserID), Builders<BsonDocument>.Update.AddToSet("Documents", doc));
           

这就是我创建索引的方式:

db.PeopleDocument.createIndex( {UploadTime:1}, 
                               {
                                  expireAfterSeconds:900,
                                  partialFilterExpression:{
                                                            FileType:{$eq:"IDCardCopy"}
                                                            }
                                })

这是 db.PeopleDocument.getIndexes() 的结果:

 {
    "v":2,
    "key":{
           "_id":1
           },
     "name" :"_id_",
      "ns" : "people.PeopleDocument"
},
{ 

 "v":2,
    "key":{
           "UploadTime":1
           },
     "name" :"UploadTime_1",
      "ns" : "people.PeopleDocument",
      "expireAfterSeconds":900,
      "partialFilterExpression":{
               "FileType": { "$eq":"IDCardCopy"
                 }
           }
 }
          

这在 900 秒后没有删除文件,这可能是日期问题吗?

【问题讨论】:

  • 为什么不将fileType 添加到您的索引中?
  • db.PeopleDocument.createIndex( { "fileType": "IDCard" }, { expireAfterSeconds: 31622400} ) 你是这个意思吗?
  • 你可以试试 ttl 和部分索引:stackoverflow.com/a/50272567/4368485
  • @ĐĵΝιΓΞΗΛψΚ db.PeopleDocument.createIndex({"uploadTime":1}, {exprieAfterSeconds:900, partialFilterExpression:{"FileType":{$eq:"IDCardCopy"}}}) 这就是我创建索引时所做的。只是为了测试我放了 900 秒(15 分钟),我仍然可以看到在 15 分钟之前上传的 IDCardCopy。我做错了吗?

标签: c# mongodb


【解决方案1】:

我通过创建一个 C# 控制台应用程序来解决这个问题,该应用程序将删除一年前创建的文档,我创建了一个任务计划程序,它将每天运行以运行此应用程序。

【讨论】:

    【解决方案2】:

    这对我有用。 10 秒后(不完全是因为删除线程每 60 秒运行一次),IDCardCopy 文档就消失了。

    db.PeopleDocument.createIndex(
        { "uploadTime": 1 },
        {
            expireAfterSeconds: 10,
            partialFilterExpression: { "FileType": { $eq: "IDCardCopy" } }
        }
    )
    
    db.PeopleDocument.insertMany(
        [
            {
                uploadTime: new ISODate(),
                FileType: "IDCardCopy"
            },
            {
                uploadTime: new ISODate(),
                FileType: "taxCopy"
            },
        ]
    )
    

    确保在您的应用程序中将 uploadTime 字段设置为正确的 UTC 时间。

    【讨论】:

    • 我在我的问题中添加了更多细节,我所做的和你一样。我的UploadTime 日期有问题吗?
    • 我认为您的uploadTime 可能作为字符串存储在数据库中。并且 ttl 索引正在寻找 ISODate。我认为您需要在 bsondocument 中设置日期,例如:{ "UploadTime", DateTime.UtcNow.ToString("O")}
    • 我正在使用 Mongo Management Studio 查看文档。对于 UploadTime,它具有以下内容:"UploadTime":"ISODate(2020-12-06T05:41:32.698Z)"。我认为它的格式正确
    • 尝试使用 DateTime.UtcNow。可能是时区偏移量没有导致它被删除。您也可以尝试使用 mongo 管理工作室使用new ISODate() 将示例文档添加到集合中。看看该文件是否被正确删除。是这样,那你用bsondocument插入文档的方式肯定有问题。
    • 我试过了,没用。我正在使用 Mongo3.4,我认为这不是问题。
    【解决方案3】:

    我认为您应该添加PeopleDocumentexpiresAt 并根据您的文件类型填写此字段以创建具体记录。然后像这样简单地创建索引:

    db.PeopleDocument.createIndex( { "expiresAt": 1 }, { expireAfterSeconds: 0} ) 
    

    【讨论】:

    • 这不起作用。在PeopleDocument中,只有IDCardCopy有expiresAttaxCopyPermitCopy没有,我认为这是导致错误。
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 2017-02-21
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多