今天打开电脑时发现 mongodb 裡测试用的资料都被砍了,重新开 server 随便注册几个帐号进去一段时间后,资料又不见了。 折腾一个上午后发现,我之前有设一个 out_date 的标签,当时裡面只有塞两分钟的期限。
Schema 如下:
out_date: { type: Date, default: new Date().setMinutes(new Date().getMinutes() + 2) }
但当时我只是写好放着,没有写其他 code 去检查是否过期,关掉 server 一段时间后,在 mongodb 裡的资料还是不见了。
重新塞一个帐号进去,然后用 MongoHub 把这个资料删除储存后,该笔帐号就没再消失了。 不过我搜寻不到相关的资料,请问 out_date 是一个 mongodb 关键字吗?谢谢
不是保留关键字,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,学习了