Mongoose过期数据但保留在数据库中

lea*_*rrr 2 mongoose mongodb node.js express

我目前通过mongoose架构保存数据并从数据库过期,如下所示:

var UserSchema = new Schema({
    createdAt: { type: Date, expires: '1m' },
    name: String,
    email: String
});
Run Code Online (Sandbox Code Playgroud)

唯一的问题是保存到数据库的文档已从数据库中完全删除.我将如何重构上述内容,以便名称/电子邮件地址保留在数据库中,但如果用户在到期日后尝试登录,则会收到一条消息"会话已过期,续订会话".(或类似的东西)

我想这样做,因为如果用户使用过期的电子邮件地址登录,服务器仍然能够查找电子邮件地址并吐出"过期的会话"消息,而不是"未找到"错误,这是删除数据时会发生什么.

重申一下,如何将过期数据保存在mongo/mongoose数据库中,以便应用程序能够找到用户尝试登录的电子邮件地址,但如果他们的会话已过期,他们需要续订会话吗?

Har*_*ngh 5

您应该使用Schema Reference的概念.将您过期的字段保存在另一个表中并加入您的主要user_tableexpire_table(例如名称)

var UserSchema = new Schema({
    name: String,
    email: String
});

//save date by-default
//expire in 1 min as in your example
var expireSchema = new Schema({
    createdAt: { type: Date, default: Date.now, expires: '1m'  },
    user_pk: { type: Schema.Types.ObjectId, ref: 'user_expire'}
});

var userTable = mongoose.model('user_expire', UserSchema);
var expireTable = mongoose.model('expireMe', expireSchema);

//Save new user
var newUser =  new userTable({
    name: 'my_name',
    email: 'my_email'
});

newUser.save(function(err, result) {
    console.log(result, 'saved')
    var newExpire =  new expireTable({
        user_pk:result._id
    });
    //use _id of new user and save it to expire table
    newExpire.save(function(err, result) {
        console.log('saved relation')
    })
})
Run Code Online (Sandbox Code Playgroud)

现在检测会话是否已过期

1.在数据过期之前执行此代码

expireTable.findOne()
.populate('user_pk')
.exec(function (err, result) {
    if (err) throw err;
    console.log(result)
    if(result == null) {
        console.log('session has expired, renew session')
    } else {
        console.log('session is active')
    }
});

//output - session is active
Run Code Online (Sandbox Code Playgroud)

2.在数据过期后执行此代码

expireTable.findOne()
.populate('user_pk')
.exec(function (err, result) {
    if (err) throw err;
    console.log(result)
    if(result == null) {
        console.log('session has expired, renew session')
    } else {
        console.log('session is active')
    }
});

//output - session has expired, renew session
Run Code Online (Sandbox Code Playgroud)