我如何设置在Mongoose中创build文档的TTLdate?

我想在Mongoose中制作一个promoCode模式。 在创build时,我需要能够设置促销代码的到期date。 促销代码不一定具有相同的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的价值。 我将如何去解决这个问题?

如果要为每个文档使用不同的TTL值,则可以在包含到期时间戳的字段上使用expires时间为0(如此处所述),然后设置该时间戳以反映每个文档所需的TTL。

您已经在模式中计算expirationDate ,所以您希望将TTL索引放在该字段而不是createdDate 。 但是您需要在定义中使用expires ,而不是像您使用的expiresAtSeconds

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

然后在routes.js您只需将新Promo文档上的expirationDate设置为过期时间戳(就像您已经在做的那样)。