【问题标题】:Delete Mongoose,Nodejs user at specific time在特定时间删除 Mongoose,Nodejs 用户
【发布时间】:2019-03-02 15:31:54
【问题描述】:

我有一个问题。如何在特定时间删除 mongoose 和 nodejs 用户?实际上,我希望在删除用户后的 60 天内将用户从数据库中删除。我是如何实现的?

我添加了类似 Momentjs 的东西,它应该如何处理?此代码应在 60 天后用户进行删除操作时删除。

suspended: true, 
deleted: moment.utc().valueOf()

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    你应该看看TTL (Time To Live)partial index

    从 MongoDB 3.2 开始,您可以向 TTL 索引添加一个表达式,以便仅在它们匹配时删除文档:

    db.foo.createIndex({createdDate: 1}, {
        expireAfterSeconds: 5184000, // your 60 days
        partialFilterExpression: {
            // Will remove records which have the `isRemoved` flag equal to true
            isRemoved: true
        }
    });
    

    所以这里的想法是您将flagisRemoved 作为true 的用户记录(默认为false)然后这实际上应该在60 天后自动删除它。

    【讨论】:

    • 我已经添加了类似 Momentjs 的东西,它应该如何处理?此代码应在 60 天后用户进行删除操作时删除。暂停:真,删除:moment.utc().valueOf()
    【解决方案2】:

    安装任何cron 包,例如https://www.npmjs.com/package/node-schedule 并在您的猫鼬模型中确保存储 created_at 时间戳(如果不只是timestamps:true)。每天运行 cron

    const UserSchema = new Schema({..}, { timestamps: true });
    

    现在将 sn-p 复制到您的 app.js 中

    var schedule = require('node-schedule');
    
    var j = schedule.scheduleJob('0 1 * * *', function(){
      return deleteOldUsers();
    });
    

    假设您的型号名称是User,它的目录是./models/User

    const User = require('./models/User');
    
    deleteOldUsers = () => {
      let current = new Date();
      // subtracting 60 days
      current.setDate(current.getDate() - 60);
      User.deleteMany({ created_at: {$lte: current} }, (err) => {
        if(err) return console.log("Error while erasing users " + err);
        console.log("successfully erased data")
      })
    }
    

    编辑 - 如果您想使用 MOMENT JS 代替日期

    const User = require('./models/User');
    const moment = require('moment');
    
    deleteOldUsers = () => {
     // subtracting 60 days
     let current = moment().subtract(60, 'days');
     current = moment.utc(current).format();
     User.deleteMany({ created_at: {$lte: current} }, (err) => {
       if(err) return console.log("Error while erasing users " + err);
       console.log("successfully erased data")
     })
    

    }

    【讨论】:

    • 我已经添加了类似 Momentjs 的东西,它应该如何处理?此代码应在 60 天后用户进行删除操作时删除。暂停:真,删除:moment.utc().valueOf()
    • 你能说得具体一点吗
    • 如果您想使用时刻而不是日期,我已经更新了代码,还是别的什么?
    • 我有一个用户界面,当用户想从这个界面删除他或她的帐户时,在数据库“deleted”中出现一个查询:ISODate("2018-09-27T12:42:04.717 Z"), "suspended" : true 如果用户在 60 天内没有入账,我想从数据库中删除用户,我想
    • 好吧,假设suspended 是键名,然后将上面的查找查询替换为User.deleteMany({ suspended: true, created_at: {$lte: current} }, ,现在每当他登录时,将他的suspended 状态更新为false。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2017-05-16
    相关资源
    最近更新 更多