在Mongoose模式中

时间:2018-02-20 21:43:50

标签: javascript node.js mongodb mongoose

我一直在尝试找到一种方法来强制执行模式的默认值,以便在插入时使用默认值,而不管任何输入参数。换句话说,模式的属性应始终具有默认值,如果在插入/写入时传递任何其他参数,则将忽略传递参数。

作为示例,请参阅下面的虚拟架构。我想强制执行的属性是MySchema.created,它应该存储文档创建时刻的时间戳。

var mongoose = require("mongoose");

var MySchema = new mongoose.Schema({
    sendStatus:     {
                        type: String,
                        enum: ["notsent", "sent", "failed"],
                        default: "notsent"
                    },
    created:        {
                        type: Date,
                        default: Date.now
                    },
    creator:        {
                        type: mongoose.Schema.Types.ObjectId,
                        ref: "User",
                        required: true
                    }
});

我没有在Mongoose文档中找到答案(http://mongoosejs.com/docs/defaults.html),尽管它确实提到setDefaultsOnInsert,这听起来有点接近。尽管我想在架构级别上进行所有架构验证和强制执行,以避免开发错误和复制粘贴代码。此外,我不知道如何在此时间戳中使用setDefaultsOnInsert,因为我希望保持它也是常量,而不是在文档更新时更新它。

这有可能实现吗?在文档上有一个可靠的创建日期必须是一个非常常见的用例,但不知何故,我在互联网上找不到令人满意的答案。谢谢!

1 个答案:

答案 0 :(得分:0)

您只需将Mongoose timestamps添加到架构的末尾,它就会为新的/更新的文档添加时间戳

 var MySchema = new mongoose.Schema({
      sendStatus:   {
                      type: String,
                      enum: ["notsent", "sent", "failed"],
                      default: "notsent"
                    },
      creator:      {
                      type: mongoose.Schema.Types.ObjectId,
                      ref: "User",
                      required: true
                    }
                },{
      timestamps: 
                  { 
                      createdAt: 'created_at',
                      updatedAt: 'updated_at' //leave this out if of no interest 
                  }
             });