2014-06-18 90 views
2

我試圖在貓鼬一個promoCode架構。在創建時,我需要能夠設置促銷代碼的到期日期。促銷代碼不一定具有相同的TTL。我看着this question,但我的文件仍然沒有過期。如何設置在貓鼬上創建文檔的TTL日期?

這是我promoCode.js文件:現在

var mongoose = require("mongoose"); 
var promoCodeSchema = mongoose.Schema({ 
    expirationDate: Date, 
    createdAt: { 
     type: Date, 
     expireAfterSeconds: Number, 
     default: Date.now 
    } 
}) 
module.exports = mongoose.model("Promo", promoCodeSchema); 

,在routes.js,我有:

app.post("/admin/promo/create", isLoggedIn, isVerified, isAdmin, function (req, res) { 
    var promo = new Promo(); 
    promo.createdAt.expireAfterSeconds = 60; 
    // for reference, note the actual day on which the promo code should expire 
    var days = parseInt(req.body.expiration.replace(/[^\d]+/g, "")) || 1; 
    promo.expirationDate = new Date(Date.now() + (days * 24 * 3600 * 1000)); 

    promo.save(function (err) { 
     console.log(err, promo); 
     return res.redirect("/admin/promo"); 
    }); 
}) 

這是行不通的。我也需要能夠得到TTL的價值。我將如何去解決這個問題?

+0

[設置使用mongoose在MongoDB中設置集合的到期時間](http://stackoverflow.com/questions/14597241/setting-expiry-time-for-a-collection-in-mongodb-using-mongoose ) –

+0

@royhowie有趣的問題......你有沒有發現在學習貓鼬很有用,在一般平均疊加。從你的個人資料中,我可以看到你和我分享了很多東西。 –

+0

@MuhammadUmer真正學會如何正確使用回調,以及如何使用助手庫像(即,如何與錯誤傳播的/ etc寫你自己的)[異步](https://github.com/caolan/async)(或者你可以用[q](https://github.com/kriskowal/q)去承諾路線)。總是用[express](http://expressjs.com)滾動。 [lodash](https://lodash.com)或[下劃線](http://underscorejs.org)也是總是有用的(但不是必需的) – royhowie

回答

3

當要對每個文檔使用不同的TTL值,可以在包含期滿時間戳(如所描述的here),然後設置該時間戳,以反映對於每個文檔您想要的TTL字段使用expires時間的0 。

您已經在模式中計算了expirationDate,因此您希望將TTL索引放在該字段而不是createdDate。但是你需要在定義中使用expires,不expiresAtSeconds像你使用:

var promoCodeSchema = mongoose.Schema({ 
    expirationDate: { 
     type: Date, 
     expires: 0 
    }, 
    createdAt: { 
     type: Date, 
     default: Date.now 
    } 
}); 

然後在routes.js,你只需要設置expirationDate在新Promo文檔到過期時間戳(如您已這樣做)。