【问题标题】:Mongoose delete records after certain time猫鼬在一定时间后删除记录
【发布时间】:2021-04-05 14:18:40
【问题描述】:

我有一个看起来像这样的猫鼬模式:

const USERS_DATA = new Schema({
    _id: Number,
    name: String,
    img: String,
    date: Date,
    phone: String,
    article: String,
    createdAt: {
        type: Date,
        required: true,
        default: Date.now,
        index: { expires: '3d' }
      }
},
{ 
    collection: "users",
    _id: false,
}

);

我需要将数据推送到此架构。

const User = mongoose.model("users", USERS_DATA);
function pushToDB() {
    const newUser = new User({
      name: INPUT.name,
      img: INPUT.img,
      date: INPUT.date,
      phone: INPUT.phone,
      article: INPUT.article,
    });
    newUser.save(function (err) {
       mongoose.disconnect();
       if (err) return console.log(err);
});

}

此数据必须在推送到数据库后 3 天后删除。如何在 node.js 中实现它?我发现它真的很混乱,并尝试了很多代码。任何答案表示赞赏!谢谢

附:我使用 mongoDb Atlas

【问题讨论】:

  • 我建议使用节点 cron 或 setTimeout() 并将持续时间设置为 3 天。在那之后,只需从数据库中删除文档
  • @GillesHeinesch 我认为这会有点困难,因为对于这个解决方案,我需要为每个查询调用超时并比较当前日期和创建查询时的日期。但我可能是错的
  • @GillesHeinesch 分贝。在我的情况下是 USERS_DATA 还是 mongoose.connection?

标签: node.js mongodb mongoose mod-expires


【解决方案1】:

您应该将数据推送到数据库的过程与3天后删除数据的过程分开。你已经有了第一部分:)。 对于第二部分,您可以编写一个函数deleteOldDocument。该函数将查询DB中创建3天或更长时间的文档,并删除它们。然后,您可以定期运行此函数,例如每天 1 次。

伪代码,以备不时之需:

async function deleteOldDocument() {

    const 3DaysAgo = ...; // here you can subtract 3 days from now to obtain the value
  
    // search for documents that are created from 3 days or more, using $lt operator
    const documentToDelete = await User.find({"created_at" : {$lt : 3DaysAgo }});

   // delete documents from database
   .....

   // recall the function after 1 days, you can change the frequence
   setTimeOut(async function() {
       await deleteOldDocument();
   }), 86400);    
}

// call deleteOldDocument to start the loop
deleteOldDocument();

【讨论】:

  • 哇,它应该像它一样工作。我在 1 分钟和 5 分钟内对其进行了测试。现在我正在测试 1 小时。希望它会奏效。非常感谢!
  • 也许我做错了什么,但是当我设置 1 小时过期时,数据库会在创建后 30 分钟后删除文档。这是代码pastebin.com/RJ7rf3Jg
  • 逻辑不应该依赖于持续时间。我看到了你的代码,但我没有发现任何问题。也许尝试在调试模式下运行您的代码并检查 timeToDelete 和 FTD 变量的值。希望你能弄清楚:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多