MongoDB TTL 过期在 NodeJS 上无法正常工作
MongoDB TTL expiry doesn't work properly on NodeJS
我正在使用 MongoDB (v3.4) 作为缓存并使用 TTL 索引使记录过期。但是,TTL 设置似乎无法正常工作。具体来说,我测试了使用端点插入数据(如下所示)。
端点 mongoInsert 应该在 5 分钟后过期。但是,似乎在大约 1 分钟后,文档被删除了。我已经查找了关于使用 moment().utc().toDate() 使用 UTC 时间的其他类似建议,并且行为是相同的。 new Date() 返回UTC时间所以我想应该是一样的效果。
不确定是否还有其他设置应包括在内但未在文档中详细说明。有人遇到过这个吗?
function mongoInsert(mongoClient){
return function(req, res){
mongoClient.connect('mongodb://localhost:27017/cache', function(err, db) {
db.collection('data', function(err, collection){
var testItems = [{
"_id": "abc12345",
"dmac": "abc",
"createdAt": new Date(),
"val": {
"0": 10,
"1": 15,
"2": 5
},
"res": "minutes",
"time": "2017-12-04T00:12:58Z"
}];
let unix = new moment().valueOf();
collection.createIndex({createdAt: unix}, {expireAfterSeconds: 300});
collection.insertMany(testItems, function(err, items){
db.close();
res.json(items);
});
})
})
}
}
collection.createIndex({createdAt: 1}, {expireAfterSeconds: 60,unique:true});
和
collection.createIndex({createdAt: 1}, {expireAfterSeconds: 300,unique:true});
这是无效的
您不能使用 createIndex() 更改现有索引的 expireAfterSeconds 的值。而是将 collMod 数据库命令与索引收集标志结合使用。否则,要更改现有索引的选项值,您必须先删除索引并重新创建。
https://docs.mongodb.com/v3.4/core/index-ttl/
对于个别文件的过期,有报道说只能通过计算过期时间,按特定时钟时间过期(ref: groups.google.com/forum/#! topic/mongodb-dev/ZLb8KSrLyOo).
var testItems = [{
"_id": "abc12345",
"dmac": "abc",
"expireAt": moment().add(3, 'minutes').toDate(),
"val": {
"0": 10,
"1": 15,
"2": 5
},
"res": "minutes",
"time": "2017-12-04T00:12:58Z"
}];
let unix = new moment().valueOf();
collection.createIndex({expireAt: unix}, {expireAfterSeconds: 0}, function(error, indexName){
if(error) console.log(error);
console.log(indexName);
});
我正在使用 MongoDB (v3.4) 作为缓存并使用 TTL 索引使记录过期。但是,TTL 设置似乎无法正常工作。具体来说,我测试了使用端点插入数据(如下所示)。
端点 mongoInsert 应该在 5 分钟后过期。但是,似乎在大约 1 分钟后,文档被删除了。我已经查找了关于使用 moment().utc().toDate() 使用 UTC 时间的其他类似建议,并且行为是相同的。 new Date() 返回UTC时间所以我想应该是一样的效果。
不确定是否还有其他设置应包括在内但未在文档中详细说明。有人遇到过这个吗?
function mongoInsert(mongoClient){
return function(req, res){
mongoClient.connect('mongodb://localhost:27017/cache', function(err, db) {
db.collection('data', function(err, collection){
var testItems = [{
"_id": "abc12345",
"dmac": "abc",
"createdAt": new Date(),
"val": {
"0": 10,
"1": 15,
"2": 5
},
"res": "minutes",
"time": "2017-12-04T00:12:58Z"
}];
let unix = new moment().valueOf();
collection.createIndex({createdAt: unix}, {expireAfterSeconds: 300});
collection.insertMany(testItems, function(err, items){
db.close();
res.json(items);
});
})
})
}
}
collection.createIndex({createdAt: 1}, {expireAfterSeconds: 60,unique:true});
和
collection.createIndex({createdAt: 1}, {expireAfterSeconds: 300,unique:true});
这是无效的
您不能使用 createIndex() 更改现有索引的 expireAfterSeconds 的值。而是将 collMod 数据库命令与索引收集标志结合使用。否则,要更改现有索引的选项值,您必须先删除索引并重新创建。
https://docs.mongodb.com/v3.4/core/index-ttl/
对于个别文件的过期,有报道说只能通过计算过期时间,按特定时钟时间过期(ref: groups.google.com/forum/#! topic/mongodb-dev/ZLb8KSrLyOo).
var testItems = [{
"_id": "abc12345",
"dmac": "abc",
"expireAt": moment().add(3, 'minutes').toDate(),
"val": {
"0": 10,
"1": 15,
"2": 5
},
"res": "minutes",
"time": "2017-12-04T00:12:58Z"
}];
let unix = new moment().valueOf();
collection.createIndex({expireAt: unix}, {expireAfterSeconds: 0}, function(error, indexName){
if(error) console.log(error);
console.log(indexName);
});