请问 Nodejs 中 Mongodb 或 Mongoose 裡有 out_date 这个关键字吗?
请问 Nodejs 中 Mongodb 或 Mongoose 裡有 out_date 这个关键字吗?
今天打开电脑时发现 mongodb 裡测试用的资料都被砍了,重新开 server 随便注册几个帐号进去一段时间后,资料又不见了。 折腾一个上午后发现,我之前有设一个 out_date 的标签,当时裡面只有塞两分钟的期限。
Schema 如下:
out_date: { type: Date, default: new Date().setMinutes(new Date().getMinutes() + 2) }
但当时我只是写好放着,没有写其他 code 去检查是否过期,关掉 server 一段时间后,在 mongodb 裡的资料还是不见了。
重新塞一个帐号进去,然后用 MongoHub 把这个资料删除储存后,该笔帐号就没再消失了。 不过我搜寻不到相关的资料,请问 out_date 是一个 mongodb 关键字吗?谢谢
标题:请问 Nodejs 中 Mongodb 或 Mongoose 裡有 out_date 这个关键字吗?
内容:
在 Node.js 中使用 MongoDB 或 Mongoose 时,并不存在 out_date
这个关键字。你提到的 out_date
实际上是你自定义的一个字段名,用于表示某个数据项的过期日期。
示例代码
假设你正在使用 Mongoose 来定义一个用户模型,并且想要添加一个 out_date
字段来表示用户的过期日期。你可以这样定义你的 Schema:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: { type: String, required: true },
password: { type: String, required: true },
out_date: {
type: Date,
default: () => new Date(Date.now() + 2 * 60 * 1000) // 默认为当前时间加上2分钟
}
});
const User = mongoose.model('User', userSchema);
module.exports = User;
在这个例子中,我们定义了一个 userSchema
,其中包含一个 out_date
字段,该字段默认值为当前时间加上两分钟。这样,当你创建一个新的用户实例时,如果没有指定 out_date
,它会自动设置为当前时间加两分钟。
解释
out_date
字段:这是一个自定义字段,用于存储用户数据的过期日期。- 默认值:通过
default
函数设置,默认值为当前时间加上两分钟。这使得每个新创建的用户记录都会有一个默认的过期时间。 - 数据消失的原因:如果你的数据在一段时间后消失了,可能是因为你在应用逻辑中删除了这些记录,或者由于某种原因(如服务器重启、定时任务等)触发了数据清理逻辑。
总结
out_date
并不是 MongoDB 或 Mongoose 中的关键字,而是一个自定义字段。确保你正确地在应用逻辑中处理了这个字段,以避免数据意外丢失。
不是保留关键字,schema的定义也没问题,我建议你检查一下 “删除过期数据”的那个方法,看中间是不是什么逻辑出错了?
祝好。
可是我没写任何“删除过期数据”的方法
只是之前在 out_date 裡有加过 expires: "3m"
,但之后没多久就删掉了
#####可能的解决方案 在mongo shell中执行
db.YOUR_COLLECTION_NAME.getIndexes()
不出意外的话,除_id外你还会看到另外一个index,如下
{
"v" : 1,
"key" : {
"out_date" : 1
},
"ns" : "DB_NAME.COLLECTION_NAME",
"name" : "out_date_1",
"expireAfterSeconds" : 120,
"background" : true,
"safe" : null
}
删除该index:
db.YOUR_COLLECTION_NAME.dropIndex( { "out_date": 1 } )
#####可能的原因
- mongoose schema 中定义的expire会在mongodb中添加并激活一个TTL index。
- TTL index 会在后台运行,每分钟一次,检查是否有过期的数据,有则删除。
- 删除mongoose schema中的expire 字段并不会删除TTL index。
#####参考 mongoose API 中的expire: http://mongoosejs.com/docs/api.html#schema_date_SchemaDate-expires
mongoDB中的TTL: http://docs.mongodb.org/manual/tutorial/expire-data/
mongoDB中的index操作: http://docs.mongodb.org/manual/administration/indexes-management/
感谢您的说明,谢谢。
mark,学习了
out_date
并不是 MongoDB 或 Mongoose 中的关键字。它只是一个普通的字段名称,你可以根据需要自由定义。根据你的描述,问题可能出在你的 Schema 定义或数据处理逻辑上。
下面是示例代码,展示如何使用 out_date
字段来设置和验证数据是否过期:
示例 Schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
name: String,
out_date: { type: Date, default: () => new Date(Date.now() + 2 * 60 * 1000) }
});
const User = mongoose.model('User', userSchema);
// 设置过期检查逻辑
async function checkExpiration(userId) {
const user = await User.findById(userId);
if (!user || user.out_date < new Date()) {
console.log("用户已过期");
return false;
}
return true;
}
// 创建用户并检查过期
(async () => {
const newUser = new User({ name: 'testUser' });
await newUser.save();
const isExpired = await checkExpiration(newUser._id);
console.log(isExpired ? "未过期" : "已过期");
})();
解释
- Schema 定义:
out_date
字段默认为当前时间加两分钟。 - 检查过期:
checkExpiration
函数用于检查指定用户的out_date
是否已经过去。 - 创建和检查:创建新用户并检查其是否过期。
这样你可以通过查询 out_date
字段来判断用户是否过期。如果你仍然遇到数据消失的问题,可能需要检查其他部分的逻辑或配置。