请问 Mongodb 或 Mongoose 裡有 out_date 这个关键字吗?
发布于 11 年前 作者 Knovour 6115 次浏览 最后一次编辑是 8 年前

今天打开电脑时发现 mongodb 裡测试用的资料都被砍了,重新开 server 随便注册几个帐号进去一段时间后,资料又不见了。 折腾一个上午后发现,我之前有设一个 out_date 的标签,当时裡面只有塞两分钟的期限。

Schema 如下: out_date: { type: Date, default: new Date().setMinutes(new Date().getMinutes() + 2) }

但当时我只是写好放着,没有写其他 code 去检查是否过期,关掉 server 一段时间后,在 mongodb 裡的资料还是不见了。

重新塞一个帐号进去,然后用 MongoHub 把这个资料删除储存后,该笔帐号就没再消失了。 不过我搜寻不到相关的资料,请问 out_date 是一个 mongodb 关键字吗?谢谢

5 回复

不是保留关键字,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,学习了

回到顶部