2014-10-10 50 views
3

我想清理我的MongoDB,我想到adding a TTL index to expire documents。但基於第二個屬性,我需要爲我的文檔使用不同的TTL。是否有可能根據多個屬性在MongoDB中過期數據?

下面是一個例子:

{ 
    "_id" : ObjectId("525bd2aee4b05e96f1ec7362"), 
    "payload"  : "525bd2aee4b05e96f1ec7361", 
    "serviceId"  : "525bd2ade4b05e96f1ec735f", 
    "status"  : "STARTED", 
    "timestamp"  : ISODate("2013-10-14T11:17:01.651Z"), 
    "transaction " : "525bd2aee4b05e96f1ec7360" 
} 

我可以設置屬性timestamp一個TTL,但我需要根據serviceId不同的TTL。這可能在MongoDB 2.2.x

+1

我刪除了你的第二個問題,因爲它是1.一個不同的問題和2.一個是關於管理,因此將更好地放在https://dba.stackexchange.com – Philipp 2014-10-10 11:55:08

+0

嗯,這裏又是評論:當我過期文檔並運行compact或repairDatabase命令時,MongoDB是否會在硬盤上釋放空間? – cringe 2014-10-10 11:56:24

回答

3

不,TTL索引不包含除if field < now - expireAfterSeconds then delete document以外的任何條件邏輯。

但是,可能有一種解決方法可以適用於您的情況:如果您將來希望文檔過期的特定日期,則可以添加一個字段expireDate,您將其設置爲日後的日期您希望文檔到期的位置。然後,當您創建expireAfterSeconds爲0的索引時,每個文檔將在其expireDate已過時刪除。這個技巧允許你在同一個集合中擁有不同TTL的文檔。

+0

打我也是吧:) – Dreamwalker 2014-10-10 12:02:45

+0

你確定,一個集合不能有多個TTL索引。例如timestamp字段中的一個不同索引,以及serviceIdTimestamp字段上的另一個TTL索引? – cubbuk 2014-10-10 12:07:44

+0

@cubbuk閱讀[文檔]後(http://docs.mongodb.org/manual/tutorial/expire-data/#expire-documents-after-a-certain-number-of-seconds)我不是,所以我修改了我的答案的一部分。 – Philipp 2014-10-10 12:08:28

0

雖然@ Philipp的答案是相當有用的。還有另一種方式。您可以向集合中添加一個新字段,該字段包含serviceId的時間戳,並且在timestamp上分別有一個TTL索引,另一個在serviceIdTimestamp上。

相關問題