2016-02-03 24 views
3

我想完成一項特定的任務,但我沒有找到任何特定的方法來完成此任務。 可以說我有一個用來發送郵件的應用程序。我將這封郵件的記錄保存在mongo的一個集合中。使用這個應用程序,我現在可以發送郵件,也可以安排郵件以備將來使用。 在收集文件的結構是這樣的:在mongo中創建一個有條件的TTL

{ 
'_id' : 123456789, 
'to_email' : '[email protected]' 
'from_email' : '[email protected]' 
'subject': 'some subject' 
'type' : '<1 if normal and 2 if scheduled>', 
'createdDate' '<date when mail was sent or the request was created>', 
'scheduledDate' : '<time for which mail is scheduled>' 
.. and many more key-value pairs 
} 

的scheduledDate場可以是零或任何日期,這取決於其是否如期與否。 我不想保留超過2天的數據,所以我在'createdDate'上創建了2天的TTL索引。 但我也不想刪除預定未來的行或請求。 我正在尋找某種有條件的TTL,但無法找到任何此類解決方案。

有什麼可用的像條件TTL或任何其他方式在MongoDB中做到這一點。

我要製作的工作就像一個TTL:

if(requestType!=2 and createdDate < -2days) 
delete row; 

或者是有辦法,我可以用任何語言來某些文件的變化,使他們不得到過期。

編輯:我解決了這個問題,通過使用scheduledDate和requestDate在計劃郵件的情況下相同的值。

回答

5

我只想添加另一個字段。這並不是太多的數據:

{ 
'_id' : 123456789, 
'createdDate' '<date when mail was sent or the request was created>', 
'scheduledDate' : '<time for which mail is scheduled>' 
'expires': '<Date or NULL>' 
} 

添加一個0秒的TTL索引到expires字段。不要將TTL添加到其他日期。

下面的例子是貓鼬(爲節點的ORM),但思路應該結轉到任何框架,你使用:

的默認值

你可以在到期添加默認值字段的值爲'創建日期+ 2天'。

{ 
    type: Date, 
    default: function() { 
    return new Date(Date.now() + 1000*60*60*24*2); 
    } 
} 

不同的到期日爲您安排的任務

剛剛成立日期明確:

myNewDocument.expires = new Date(scheduled + ...); 

或更改設置默認值的函數:

function() { 
    if(this.get("type") === 2) { 
     return scheduled_date_plus_2_days; 
    } else { 
     return created_date_plus_2_days; 
    } 
} 

無全部到期

設置字段設置爲NULL:

myNewDocument.expires = null; 

這樣一來,你要選擇正常的電子郵件,重要的電子郵件,安排的,等不同到期的能力,如果你的時間,你甚至可以將expires字段設置爲NULL以取消自動刪除。
唯一需要注意的是,如果您更改預定時間,則需要更新過期字段。

+0

因此,您需要添加索引,以便像這樣過期[(文檔)](https://docs.mongodb.com/manual/tutorial/expire-data/#expire-documents-at-a-specific-clock-time)? 'db.emails.createIndex({「expires」:1},{expireAfterSeconds:0})' – luckydonald

+1

對我來說這看起來是正確的:在你的情況下,當前日期是'expires'的值時,文檔將被刪除領域(給或需要一分鐘)。 – RikkusRukkus

0

您可以在scheduledDate上創建TTL索引,如果該值爲零,則不會被刪除。根據documentation,如果文檔中的索引字段不是日期或包含日期值的數組,則文檔不會過期。

使用蒙戈3.2我已經驗證了這確實是使用該測試集的情況:

db.data.drop() 
db.data.save({scheduledDate: 0}) 
db.data.save({scheduledDate: new Date()}) 
db.data.save({scheduledDate: new Date()}) 
db.data.createIndex({ "scheduledDate": 1 }, { expireAfterSeconds:1}) 

當使用這個集合中的所有new Date()入口得到去除,而與零值的第一個記錄仍然

+0

但如果有另一個TTL索引爲'createdDate'設置,那麼它也不會過期? – kadamb

+0

您只想在'scheduledDate'上添加一個TTL索引,想法是您只應在成功發送後刪除記錄,否則請查看RikkusRikkus解決方案, – Jaco