请问 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 关键字吗?谢谢


7 回复

标题:请问 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 } )

#####可能的原因

  1. mongoose schema 中定义的expire会在mongodb中添加并激活一个TTL index。
  2. TTL index 会在后台运行,每分钟一次,检查是否有过期的数据,有则删除。
  3. 删除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 字段来判断用户是否过期。如果你仍然遇到数据消失的问题,可能需要检查其他部分的逻辑或配置。

回到顶部