接受的答案是好的,但與蒙戈3.0及以上,
createdAt: { type: Date, default: Date.now, expires: '1m' }
不會爲我工作。
相反,我用
var expireSchema = new Schema({
expireAt: {
type: Date,
required: true,
default: function() {
// 60 seconds from now
return new Date(Date.now() + 60000);
}
},
user_pk: { type: Schema.Types.ObjectId, ref: 'user_expire'}
});
更多信息是在這裏:Custom expiry times for mongoose documents in node js
編輯
我的評論上面也需要調用一個函數蒙哥,而不是直接通過貓鼬語法。這將是這樣的:
db.[collection-name].createIndex({ "expireAt": 1 }, { expireAfterSeconds: 0 })
而且這是做一個TTL字段的Expire Documents at a Specific Clock Time方式。
而我仍然無法讓它工作,但可能是因爲ttl收割者運行的方式不穩定(每60秒一次,但可能會更長一些......))
EDIT
我的問題是由於具有較早配置不正確TTL索引堅持在expireAt
領域,這防止了我後來的(正確定義)指數從工作。我通過刪除任何非_id較早的索引來解決這個問題,然後在expireAt
字段上重新添加我的ttl索引。
使用db.[collection-name].getIndexes()
和
db.[collection-name].dropIndex({ "expireAt":1 })
重新申請前清除。
而且另外一個警告 - 設置在expiredAt
字段的默認屬性日期快照即表示默認值將始終是一個固定的日期 - 您創建的expireSchema
實例動態每次而不是設置此日期值:
var expireSchema = new Schema({
expireAt: Date,
user_pk: { type: Schema.Types.ObjectId, ref: 'user_expire' }
});
expireSchema
.virtual('expiryTime')
.get(function() {
//allow for reaper running at 60 second intervals to cause expireAt.fromNow message to be 'in the past'
var expiryTime = moment(this.expireAt).fromNow();
if(String(expiryTime).indexOf("ago")){
expiryTime = "in a few seconds";
}
return expiryTime;
});
var expireModel = mongoose.model('UserExpire', expireSchema);
expireModel.collection.ensureIndex({ "expireAt": 1 }, { expireAfterSeconds: 0 });