如何在 Mongoose 中设置文档创建的 TTL 日期?

roy*_*wie 3 javascript mongoose mongodb node.js

我正在尝试promoCode在 Mongoose 中创建一个模式。在创建时,我需要能够设置促销代码的到期日期。促销代码不一定相同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);
Run Code Online (Sandbox Code Playgroud)

现在,在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");
    });
})
Run Code Online (Sandbox Code Playgroud)

这不起作用。我还需要能够获得TTL. 我将如何解决这个问题?

Joh*_*yHK 7

当您想为每个文档使用不同的 TTL 值时,您可以使用 expires在包含过期时间戳(如描述的场的0时间在这里),然后设置时间戳,以反映每个文档所需的TTL。

您已经expirationDate在架构中进行计算,因此您希望将 TTL 索引放在该字段而不是createdDate. 但是你需要expires在定义中使用,而不是expiresAtSeconds像您使用的那样:

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

然后在routes.js您只需要将expirationDatePromo文档设置为其到期时间戳(就像您已经在做的那样)。