mongodb背景TTL不删除文件

时间:2014-09-24 15:55:33

标签: mongodb ttl mongodb-indexes

我在Mongo 2.4.10上使用TTL索引,但它不再起作用了。例如,在一个集合中,我将它设置为5天(432000秒),我们可以看到db.collectionName.getIndexes():

    {
            "v" : 1,
            "key" : {
                    "date" : -1,
                    "background" : true,
                    "expireAfterSeconds" : 432000
            },
            "ns" : "dbName.collectionName",
            "name" : "date_-1_background__expireAfterSeconds_432000"
    }

但是单个findOne()向我展示了一个比预期更旧的文档:

    "_id" : ObjectId("53a058140cf25876d78f7d03"),
    "_class" : 
    "productIds" : [
            NumberLong(1045),
            NumberLong(1124),
            NumberLong(1277),
            NumberLong(800),
            NumberLong(978)
    ],
    "userId" : NumberLong(214120),
    "date" : ISODate("2014-06-16T11:45:21.341Z")

创建TTL索引的java代码如下:

    DBObject keys = new BasicDBObject();
    keys.put(fieldName, -1);
    keys.put("background", true);
    keys.put("expireAfterSeconds", ttlInSeconds);

    database.getCollection(collectionName).ensureIndex(keys);

直到最近,所有人似乎都工作正常:我们在制作之前没有注意到它。这发生在我的所有数据库和所有相关集合中。

出了什么问题?


编辑

我已检查过我的服务器配置,启用了TTL监视器:

my_replicat:PRIMARY> db.adminCommand({getParameter:1, ttlMonitorEnabled:1 })
{ "ttlMonitorEnabled" : true, "ok" : 1 }

1 个答案:

答案 0 :(得分:3)

您正在添加backgroundexpireAfterSeconds作为索引的其他字段,而不是索引选项。将其放在第二个DBObject参数中ensureIndex

DBObject keys = new BasicDBObject();
keys.put(fieldName, -1);

DBObject options = new BasicDBObject();
options.put("background", true);
options.put("expireAfterSeconds", ttlInSeconds);

database.getCollection(collectionName).ensureIndex(keys, options);

请注意,您需要先手动删除现有索引,然后才能重新添加。