无法在已具有索引的字段上创建TTL索引。 ...真?

时间:2014-06-12 12:22:52

标签: mongodb

来自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
}

1 个答案:

答案 0 :(得分:2)

您实际上已创建了不同的索引类型(降序)。

命令:

db.boo.ensureIndex({d: -1})

db.boo.ensureIndex({d: 1})

将创建两个单独的索引(尽管在同一个字段中)。

如果您尝试创建降序TTL索引:

db.boo.ensureIndex({d: -1}, {expireAfterSeconds: 5})

你会收到错误:

  

名称为...的索引已存在,具有不同的选项

如果你想成为"聪明的"并更改您将获得的索引名称:

  

带模式的索引......已存在不同的选项

我想你应该提交一个bug来更准确地描述它们的文档/教程。