MongoDB expireAfterSeconds / TTL 不会删除现有集合中的数据

fal*_*410 0 mongodb

我有一个包含现有数据的集合。我使用 expireAfterSeconds 参数向该集合添加了一个新索引:

2015-11-11T09:09:21.565+0100 I INDEX    [conn120] build index on: cmon.cmon.interfaces_history properties: { v: 1, key: { expireAt: 1 }, name: "expireAt_1", ns: "cmon.cmon.interfaces_history", expireAfterSeconds: 1 }
2015-11-11T09:09:21.565+0100 I INDEX    [conn120]    building index using bulk method
2015-11-11T09:09:21.730+0100 I INDEX    [conn120] build index done.  scanned 8933 total records. 0 secs
2015-11-11T09:09:21.733+0100 I COMMAND  [conn120] command cmon.$cmd command: createIndexes { createIndexes: "cmon.interfaces_history", indexes: [ { expireAfterSeconds: 1, name: "expireAt_1", key: { expireAt: 1 } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:113 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, MMAPV1Journal: { acquireCount: { w: 17870 }, acquireWaitCount: { w: 1 }, timeAcquiringMicros: { w: 886 } }, Database: { acquireCount: { W: 1 } }, Collection: { acquireCount: { W: 1 } }, Metadata: { acquireCount: { W: 2 } } } 169ms
Run Code Online (Sandbox Code Playgroud)

然后我添加了一个新条目,其expireAt值设置如下:

{
"_id" : ObjectId("56446521637140e419b881c7"),
"DeviceName" : "mx1",
"updateTime" : ISODate("2015-11-05T11:17:10.000Z"),
"expireAt" : ISODate("2015-11-12T11:10:13.257Z"),
"DomainName" : "domain.net",
"ifAdminStatus" : "up",
"ifName" : "3002",
"ifOperStatus" : "up"
}
Run Code Online (Sandbox Code Playgroud)

该集合中的现有条目看起来完全相同,但没有设置expireAt。MongoDB 不会从数据库中删除此条目。当我在空集合和测试数据库上测试它时,它起作用了。

> db.serverStatus().metrics.ttl
{ "deletedDocuments" : NumberLong(0), "passes" : NumberLong(823) }
Run Code Online (Sandbox Code Playgroud)

所以我怀疑它不会删除此条目,因为集合中还有其他条目没有此字段。或者问题是别的什么?

Dmy*_*nko 5

"expireAt" : ISODate("2015-11-12T11:10:13.257Z")
Run Code Online (Sandbox Code Playgroud)

您指定的到期日期和时间是将来的。截至本回答发布之时,两分钟后即到期。这就是该文档仍未从您的集合中删除的原因。但很快就会被删除。

您指定的日期/时间格式Z末尾有一个 ,强制使用 UTC 时区。

  • 谢谢,你是对的。即使我在本地运行 mongoDB 和我的 Python 代码并使用 datetime.datetime.now() + datetime.timedelta(seconds=60) 设置 expireAt 值,它实际上不是使用我的系统时间而是使用 UTC 时区创建了 datetime 对象。 (2认同)