我正在尝试在 Mongoose 中创建一个 promoCode
模式。创建时,我需要能够设置促销代码的到期日期。促销代码不一定具有相同的 TTL
。我看了this question ,但我的文件还没有过期。
这是我的 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 值时,您可以在包含到期时间戳的字段上使用 0 的 expires
时间(如 here 所述),然后设置该时间戳以反射(reflect)每个文档所需的 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
设置为其到期时间戳(就像您已经在做了)。
关于javascript - 如何在 Mongoose 中设置文档创建的 TTL 日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24275117/