简体   繁体   中英

Enforcing the default value in Mongoose schema

I have been trying to find a way to enforce the default value of a schema so that the default value is being used upon insert regardless of any input parameter. In other words a property of a schema should always have the default value and if any other parameter is being passed on insert/write that passed parameter would be ignored.

As an example, please see my dummy schema below. The property I want to enforce is MySchema.created , which is supposed to store the timestamp of the moment document gets 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
                    }
});

I did not find an answer in Mongoose documentation ( http://mongoosejs.com/docs/defaults.html ) even though it do mention setDefaultsOnInsert , which sounds somewhat close. Altough I would like to do all the schema validation and enforcements on schema level to avoid development mistakes and copy-paste code. Also I don't see how I could use setDefaultsOnInsert for this timestamp, because I want to keep it also constant and not update it upon document update.

Is this possible to achieve? Having a reliable creation date on a document must be a very common use case, but somehow I fail to find a satisfying answer in the internet. Thanks!

You can simply add Mongoose timestamps to the end of your schema and it will timestamp your new/updated document

 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 
                  }
             });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM