2015-11-12 316 views
0

我有一個包含現有數據的集合。我添加了一個新的索引到此集合與expireAfterSeconds參數:MongoDB expireAfterSeconds/TTL不會刪除現有集合中的數據

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 

然後我說有這樣設置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" 
} 

在此集合正好看看現有條目相同但沒有expireAt設置。 MongoDB不會從數據庫中刪除這個條目。當我 測試它在一個空的收集和測試數據庫它的工作。

> db.serverStatus().metrics.ttl 
{ "deletedDocuments" : NumberLong(0), "passes" : NumberLong(823) } 

所以我懷疑它不會刪除這個條目,因爲集合中有其他的條目沒有這個字段。還是其他問題呢?

+0

這不是TTL索引和清除的工作方式。它實際上是根據從文檔中指定的日期字段(和索引字段)傳遞的設定時間段在索引中設置的屬性。請參閱[文檔](https://docs.mongodb.org/manual/tutorial/expire-data/) –

+0

@BlakesSeven,根據OP所附的日誌,他確實遵循了文檔。 '{expireAfterSeconds:1,name:「expireAt_1」,key:{expireAt:1}}'。看起來你沒有仔細閱讀這個問題。 –

+0

@DmytroShevchenko它看起來像OP,並且你自己沒有正確地閱讀文檔,因爲TTL過程只運行「每60秒一次」,因此允許最多兩分鐘才能進行實際刪除。規定的1秒明確表示該文件預計將立即被刪除,這與所有不是的文件形成對比。因此,這不是一個經過深入研究的問題。 –

回答

1
"expireAt" : ISODate("2015-11-12T11:10:13.257Z") 

您指定的失效日期和時間是將來的。截至這個答案的時候,到期將在兩分鐘後發生。這就是爲什麼文檔仍未從您的收藏中刪除。但它很快就會被刪除。

您指定的日期/時間格式最後有一個Z,它強制執行UTC時區。

+2

謝謝,你是對的。即使我在本地運行mongoDB和Python代碼,並使用datetime.datetime.now()+ datetime.timedelta(秒= 60)設置expireAt值,它實際上創建了與我的系統時間不同的datetime對象,但使用UTC時區。 – falc410

+1

@ falc410我很高興能幫上忙! –

+0

@VivekSingh您的評論完全超出了問題的範圍。請爲此創建一個單獨的問題。 –