Mongoose 到期 属性 无法正常工作
Mongoose expires property not working properly
答案
所以当我在 Mongoose 中使用 expires 属性 进行测试时,我成功地在数据库中设置了 TTL 索引,但没有意识到当我更改猫鼬模式中的时间时,我需要先从数据库中删除以前的 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
}
]
所以虽然我指定了 60 秒,但它的设置为 5400?嗯
第二次更新
Heres a minimal example 我正在尝试 运行。我一定在这里遗漏了一些东西,因为我实际上将我的模型从我的原始项目复制到示例中(减去一些额外的字符串字段),现在文档根本没有过期?请让我感到愚蠢,并意识到我遗漏了一些明显的东西。我想了一秒钟,将间隔设置为 运行 文档和当前时间之间的时差检查,然后意识到 运行 经常会扩展的许多查询有多糟糕。嗯...
MongoDB v3.0.1 && Mongoose v4.0.1
相关代码在:/routes/index.js
我的一些测试值运行:
整个字段看起来像这样
createdAt: { type: Date, expires: 3600, default: Date.now }
测试 1:(测试 3 次)
expires: ’300s’
过期时间:
2:00 && 2:50 && 2:28
测试 2:(测试 2 次)
expires: ‘600s'
过期时间:
2:08
&&
2:58
测试 3:
expires: 600
过期时间:2:55
测试 4:
expires: 3600
过期于:
2:13
更新:
我又回来了,因为我尝试了不同版本的 MongoDB,所以我决定尝试不同版本的 Mongoose v3.7.4。不幸的是我得到了同样的结果。我开始怀疑这是否可能是由我的实际计算机引起的问题(我在本地主机上 运行ning)?我不确定如何 MongoDB gets/sets/monitors 它的日期时间,但我假设它必须从我的计算机设置中获取它。有什么好的方法可以让我进一步 testing/debugging 吗?
原题:
好的,我已经在此处查看了一些关于使用 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
});
版本:
猫鼬 4.0.1
mongodb 3.0.1(也在 2.6.7 中测试过)
修改您的 Mongoose 架构不会修改现有索引,因此您需要手动删除 TTL 索引并重新启动您的应用以使用当前定义重新创建索引。
db.sampletexts.dropIndex('createdAt_1')
答案
所以当我在 Mongoose 中使用 expires 属性 进行测试时,我成功地在数据库中设置了 TTL 索引,但没有意识到当我更改猫鼬模式中的时间时,我需要先从数据库中删除以前的 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
}
]
所以虽然我指定了 60 秒,但它的设置为 5400?嗯
第二次更新
Heres a minimal example 我正在尝试 运行。我一定在这里遗漏了一些东西,因为我实际上将我的模型从我的原始项目复制到示例中(减去一些额外的字符串字段),现在文档根本没有过期?请让我感到愚蠢,并意识到我遗漏了一些明显的东西。我想了一秒钟,将间隔设置为 运行 文档和当前时间之间的时差检查,然后意识到 运行 经常会扩展的许多查询有多糟糕。嗯...
MongoDB v3.0.1 && Mongoose v4.0.1
相关代码在:/routes/index.js
我的一些测试值运行:
整个字段看起来像这样
createdAt: { type: Date, expires: 3600, default: Date.now }
测试 1:(测试 3 次)
expires: ’300s’
过期时间: 2:00 && 2:50 && 2:28
测试 2:(测试 2 次)
expires: ‘600s'
过期时间: 2:08 && 2:58
测试 3:
expires: 600
过期时间:2:55
测试 4:
expires: 3600
过期于:
2:13
更新:
我又回来了,因为我尝试了不同版本的 MongoDB,所以我决定尝试不同版本的 Mongoose v3.7.4。不幸的是我得到了同样的结果。我开始怀疑这是否可能是由我的实际计算机引起的问题(我在本地主机上 运行ning)?我不确定如何 MongoDB gets/sets/monitors 它的日期时间,但我假设它必须从我的计算机设置中获取它。有什么好的方法可以让我进一步 testing/debugging 吗?
原题:
好的,我已经在此处查看了一些关于使用 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
});
版本:
猫鼬 4.0.1
mongodb 3.0.1(也在 2.6.7 中测试过)
修改您的 Mongoose 架构不会修改现有索引,因此您需要手动删除 TTL 索引并重新启动您的应用以使用当前定义重新创建索引。
db.sampletexts.dropIndex('createdAt_1')