adr*_*mer 3 mongoose mongodb nosql
答案
因此,当我在Mongoose中使用expires属性进行测试时,我成功地在数据库中设置了TTL索引,但没有意识到当我在我的mongoose模式中更改时间时我需要删除以前的TTL索引首先退出数据库.
TLDR; - 停止应用程序并删除要更改的字段的TTL索引(请参阅下面的评论/答案)
得到索引
好的,以下示例中的代码,在调用之后:
db.sampletexts.getIndexes()
我得到了
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.sampletexts"
},
{
"v" : 1,
"key" : {
"createdAt" : 1
},
"name" : "createdAt_1",
"ns" : "test.sampletexts",
"expireAfterSeconds" : 5400,
"background" : true,
"safe" : null
}
]
Run Code Online (Sandbox Code Playgroud)
所以虽然我指定60秒,它的设置为5400?呵呵.
第二次更新
这是我试图运行的最小例子.我必须在这里遗漏一些东西,因为我实际上将我的模型从原始项目复制到示例(减去一些额外的字符串字段),现在文档根本没有过期?拜托,让我感到愚蠢,并意识到我错过了一些明显的东西.我想了一下,设置一个间隔来运行文档和当前时间之间的时差检查,然后意识到通常会扩展的许多查询运行得有多糟糕.嗯...
MongoDB v3.0.1 && Mongoose v4.0.1
相关代码:/routes/index.js
我运行的一些测试值:
整个领域看起来像这样
createdAt: { type: Date, expires: 3600, default: Date.now }
Run Code Online (Sandbox Code Playgroud)
测试1 :(测试3x)
expires: ’300s’
已过期:2:00 && 2:50 && 2:28
测试2 :(测试2x)
expires: ‘600s'
已过期:2:08 && 2:58
测试3:
expires: 600
在2:55到期
测试4:
expires: 3600
在2:13过期
更新:
我回过头来决定自从我尝试了不同版本的MongoDB后,我会尝试使用不同版本的Mongoose v3.7.4.不幸的是我得到了相同的结果.我开始怀疑这可能是我的实际计算机引起的问题(我在localhost上运行)?我不确定MongoDB如何获取/设置/监视其DateTime,但我认为它必须从我的计算机设置中获取它.有没有一种方法可以进一步测试/调试?
原始问题:
好的,我已经看过一些关于Mongoose和MongoDB的文档到期的其他答案,但它们似乎是因为它们
a)文档未被删除
要么
b)在指定后将其删除
我的问题是该文件被删除,但无论如何都会在1分钟后删除.因此,当我指定时间时无关紧要,它会在60秒后删除它.我看到MongoDB每分钟运行一次检查,删除指定的文档,默认为60秒,所以我假设MongoDB确认了可过期的文件,但没有通过TTL参数,我很难过.任何帮助,将不胜感激.
继承我的模特:
var schema = mongoose.Schema({
user_id: String,
message: String,
createdAt: { type: Date, expires: '4h', default: Date.now },
location: Object
});
Run Code Online (Sandbox Code Playgroud)
版本:
猫鼬4.0.1
mongodb 3.0.1(也在2.6.7中测试过)
修改Mongoose模式不会修改现有索引,因此您需要手动删除TTL索引并重新启动应用程序以使用当前定义重新创建索引.
db.sampletexts.dropIndex('createdAt_1')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3223 次 |
| 最近记录: |