【问题标题】:How can I set the TTL date on document creation in Mongoose?如何在 Mongoose 中设置文档创建的 TTL 日期?
【发布时间】:2014-08-08 03:11:45
【问题描述】:

我正在尝试在 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 的值。我将如何解决这个问题?

【问题讨论】:

  • @royhowie 好问题...你有没有发现任何对学习猫鼬和一般平均堆栈有用的东西。从您的个人资料中,我可以看到您和我有很多共同点。
  • @MuhammadUmer 真正学会了如何正确使用回调(即如何编写自己的错误传播/等)以及如何使用像 async 这样的帮助库(或者你可以使用 promises 路线q)。始终使用expresslodashunderscore 也总是有用的(但不是必需的)

标签: javascript node.js mongodb mongoose


【解决方案1】:

当您想为每个文档使用不同的 TTL 值时,您可以在包含过期时间戳的字段上使用 0 的 expires 时间(如 here 所述),然后设置该时间戳以反映您所需的 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 设置为其到期时间戳(就像您已经在做的那样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 2014-05-13
    • 2016-02-24
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多