MongoDB TTL 索引不删除过期文档

MongoDB TTL index doesn't delete expired documents

我正在尝试创建一个名为 ttl 的 collection,并使用 TTL 索引,使 collection 中的文档在 30 秒后过期。

我使用 mongoengine 创建了 collection,像这样:

class Ttl(Document):
    meta = {
        'indexes': [
            {
                'name': 'TTL_index',
                'fields': ['expire_at'],
                'expireAfterSeconds': 0
            }
        ]
    }

    expire_at = DateTimeField()

索引已创建,Robo3T 显示它符合预期。

实际文档也使用 mongoengine 插入到 collection:

current_ttl = models.monkey.Ttl(expire_at=datetime.now() + timedelta(seconds=30))
current_ttl.save()

保存成功(文档插入DB),但永不过期!

如何使文件过期?

我也在此处添加 collection 的内容,以防我保存错误。这些是 运行 db.getCollection('ttl').find({}) 的结果:

/* 1 */
{
    "_id" : ObjectId("5ccf0f5a4bdc6edcd3773cd6"),
    "created_at" : ISODate("2019-05-05T19:31:10.715Z")
}

/* 2 */
{
    "_id" : ObjectId("5ccf121c0b792dae8f55cc80"),
    "expire_at" : ISODate("2019-05-05T19:41:08.220Z")
}

/* 3 */
{
    "_id" : ObjectId("5ccf127d6729084a24772fad"),
    "expire_at" : ISODate("2019-05-05T19:42:47.522Z")
}

/* 4 */
{
    "_id" : ObjectId("5ccf15bab124a97322da28de"),
    "expire_at" : ISODate("2019-05-05T19:56:56.359Z")
}

根据 db.getCollection('ttl').getIndexes() 的结果,索引本身是:

/* 1 */
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "monkeyisland.ttl"
    },
    {
        "v" : 2,
        "key" : {
            "expire_at" : 1
        },
        "name" : "TTL_index",
        "ns" : "monkeyisland.ttl",
        "background" : false,
        "expireAfterSeconds" : 0
    }
]

我的 db.version() 是 4.0.8,运行 是 Ubuntu 18.04。

问题在于:

current_ttl = models.monkey.Ttl(expire_at=datetime.now() + timedelta(seconds=30))

应该是

current_ttl = models.monkey.Ttl(expire_at=datetime.utcnow() + timedelta(seconds=30))