来自10Gen Docs:
"您无法在已有索引的字段上创建TTL索引。"
然而,看起来这很好用。 文档的真正含义是什么?
在此示例中,我在添加TTL之前在字段d
上创建多个索引。 TTL显示正确:
"expireAfterSeconds" : 5
并正确删除文件。
mongo shell:
> db.boo.ensureIndex({a: 1, b: 1, d: -1})
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.boo.ensureIndex({d: -1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
> db.boo.ensureIndex({d: 1}, {expireAfterSeconds: 5});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4,
"ok" : 1
}
> db.boo.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.boo"
},
{
"v" : 1,
"key" : {
"a" : 1,
"b" : 1,
"d" : -1
},
"name" : "a_1_b_1_d_-1",
"ns" : "test.boo"
},
{
"v" : 1,
"key" : {
"d" : -1
},
"name" : "d_-1",
"ns" : "test.boo"
},
{
"v" : 1,
"key" : {
"d" : 1
},
"name" : "d_1",
"ns" : "test.boo",
"expireAfterSeconds" : 5
}
]
实际受限制的组合是将TTL过期添加到现有索引,如下所示:
> db.boo.ensureIndex({d: 1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.boo.ensureIndex({d: 1}, {expireAfterSeconds: 5});
{
"ok" : 0,
"errmsg" : "Index with name: d_1 already exists with different options",
"code" : 85
}
答案 0 :(得分:2)
您实际上已创建了不同的索引类型(降序)。
命令:
db.boo.ensureIndex({d: -1})
和
db.boo.ensureIndex({d: 1})
将创建两个单独的索引(尽管在同一个字段中)。
如果您尝试创建降序TTL索引:
db.boo.ensureIndex({d: -1}, {expireAfterSeconds: 5})
你会收到错误:
名称为...的索引已存在,具有不同的选项
如果你想成为"聪明的"并更改您将获得的索引名称:
带模式的索引......已存在不同的选项
我想你应该提交一个bug来更准确地描述它们的文档/教程。