2014-06-18 91 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文档到过期时间戳(如您已这样做)。