0

我为此使用猫鼬。

我的架构是这样的:

var UsuarioSchema = new Schema({
    email : { type : Email, index : { unique : true}, required : true },
    //some other fields, but not required, hopefully, for this sample code
    test_expira : { type : Date, default : Date.now, index : { expires : 120 }}
});

在 mongodb shell 上运行时,这是我认为重要的信息:

> db.usuarios.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "dbnamehere.usuarios",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
            "email" : 1
        },
        "unique" : true,
        "ns" : "dbnamehere.usuarios",
        "name" : "email_1",
        "background" : true,
        "safe" : true
    },
    {
        "v" : 1,
        "key" : {
            "test_expira" : 1
        },
        "ns" : "dbnamehere.usuarios",
        "name" : "test_expira_1",
        "expiresAfterSeconds" : 120,
        "background" : true,
        "safe" : true
    }
]
> new Date();
ISODate("2013-06-12T17:41:43.263Z")
> db.usuarios.findOne({email : 'someemail@gmail.com'});
{
    /* some fields go in here! */
    "email" : "someemail@gmail.com",
    /* some more fields go in here */
    "_id" : ObjectId("51b8b087de01a2ec28000002"),
    "test_expira" : ISODate("2013-06-12T17:31:51.156Z"),
    /* some yet more fields go in here */
    "__v" : 0
}

我还没有测试过多久没有被删除,但即使是文档状态也只有一分钟的开销应该是人们可以预期的,但对于一个应该只持续 120 秒的文档来说,不会超过 15 分钟。

我不确定如何处理这个问题。帮助将不胜感激:)

编辑:正在使用的 mongodb 版本是 v2.4.4 mongoose 版本是 3.0.3

4

1 回答 1

2

我已经测试了这个特性,它适用于 2.4.4 MongoDB。

仔细查看您的索引后,我意识到问题是一个小错字。

我的 TTL 索引有效:

{
    "v" : 1,
    "key" : {
        "test_expira" : 1
    },
    "ns" : "test.usuarios",
    "name" : "test_expira_1",
    "expireAfterSeconds" : 120,
    "background" : true,
    "safe" : true
}

您的 TTL 索引不起作用:

{
    "v" : 1,
    "key" : {
        "test_expira" : 1
    },
    "ns" : "dbnamehere.usuarios",
    "name" : "test_expira_1",
    "expiresAfterSeconds" : 120,
    "background" : true,
    "safe" : true
}

请注意,TTL 索引的正确键名是“expireAfterSeconds”,其中您的键名是“expiresAfterSeconds”。

于 2013-06-16T14:51:39.093 回答