2013-06-12 56 views
0

我爲此使用貓鼬。Mongodb(使用貓鼬)expiresAfterSeconds(TTL)似乎並沒有工作

我的模式是這樣的:

var UsuarioSchema = new Schema({ 
    email : { type : Email, index : { unique : true}, required : true }, 
    //some other fields, but not required, hopefully, for this sample code 
    test_expira : { type : Date, default : Date.now, index : { expires : 120 }} 
}); 

當MongoDB的shell中運行,這是我相信事項的資料:

> db.usuarios.getIndexes() 
[ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "ns" : "dbnamehere.usuarios", 
     "name" : "_id_" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "email" : 1 
     }, 
     "unique" : true, 
     "ns" : "dbnamehere.usuarios", 
     "name" : "email_1", 
     "background" : true, 
     "safe" : true 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "test_expira" : 1 
     }, 
     "ns" : "dbnamehere.usuarios", 
     "name" : "test_expira_1", 
     "expiresAfterSeconds" : 120, 
     "background" : true, 
     "safe" : true 
    } 
] 
> new Date(); 
ISODate("2013-06-12T17:41:43.263Z") 
> db.usuarios.findOne({email : '[email protected]'}); 
{ 
    /* some fields go in here! */ 
    "email" : "[email protected]", 
    /* some more fields go in here */ 
    "_id" : ObjectId("51b8b087de01a2ec28000002"), 
    "test_expira" : ISODate("2013-06-12T17:31:51.156Z"), 
    /* some yet more fields go in here */ 
    "__v" : 0 
} 

我沒有爲它去多長時間測試而不會被刪除,但即使是文檔狀態,只需要一分鐘的開銷就可以達到預期的效果,但對於只能持續120秒的文檔,15分鐘不會超過15分鐘。

我不確定如何處理此問題。幫助將不勝感激:)

編輯: 正在使用的版本的MongoDB是v2.4.4 貓鼬的版本是3.0.3

+0

看在mongod日誌 - 你看TTLMonitor線程每分鐘運行嗎? –

+0

順便說一句,當你在日誌中,請記下它在服務器上的時間 - 新的Date()爲您提供了shell主機時間,而不是服務器時間。它可能早於您的服務器。 –

+0

我發現TTLMonitor沒有運行的證據。我不確定在mongodb.conf中的哪個位置我應該指定此配置,以防我必須明確指出它是必需的,我知道我當前的配置文件沒有指出它......我認爲只需通過添加索引TTLMonitor線程會自動開始運行。另外,感謝您的迴應! – Mamsaac

回答

2

我已經測試了這個功能,它正常工作與2.4.4 MongoDB的。

仔細看看您的索引後,我意識到問題是一個小錯字。

我的TTL指數,其工作原理:

{ 
    "v" : 1, 
    "key" : { 
     "test_expira" : 1 
    }, 
    "ns" : "test.usuarios", 
    "name" : "test_expira_1", 
    "expireAfterSeconds" : 120, 
    "background" : true, 
    "safe" : true 
} 

你TTL指數不工作:

{ 
    "v" : 1, 
    "key" : { 
     "test_expira" : 1 
    }, 
    "ns" : "dbnamehere.usuarios", 
    "name" : "test_expira_1", 
    "expiresAfterSeconds" : 120, 
    "background" : true, 
    "safe" : true 
} 

注爲TTL指數正確的鍵名是「expireAfterSeconds」裏你有一個額外的信是「expiresAfterSeconds」。

+0

我意識到你正在使用貓鼬和「過期」是正確的方式來指定此屬性的語法。我正在檢查Mongooose和MongoDB索引定義之間的斷開連接。 –

+0

看起來像這個在Mongoose中的bug在9個月前被修復了 - 更新你的貓鼬版本? https://github.com/LearnBoost/mongoose/issues/1132 –

+0

該修復程序存在於每個從3.2.2到當前的貓鼬版本。 3.0.3你使用的是第一個添加TTL索引支持的版本,所以3.0.3到3.2.1都有這個問題。 –