Mongoose schemas support a timestamps
option. If you set timestamps: true
, Mongoose will add two properties of type Date
to your schema:
createdAt
: a date representing when this document was createdupdatedAt
: a date representing when this document was last updated
Mongoose will then set createdAt
when the document is first inserted, and update updatedAt
whenever you update the document using save()
, updateOne()
, updateMany()
, findOneAndUpdate()
, update()
, replaceOne()
, or bulkWrite()
.
const userSchema = new Schema({ name: String, age:Number, gender:String }, { timestamps: true }); const User = mongoose.model('User', userSchema); let doc = await User.create({ name: 'test', age:22,gender'Female' }); console.log(doc.createdAt); // 2022-02-26T16:37:48.244Z console.log(doc.updatedAt); // 2022-02-26T16:37:48.244Z doc.name = 'test2'; await doc.save(); console.log(doc.createdAt); // 2022-02-26T16:37:48.244Z console.log(doc.updatedAt); // 2022-02-26T16:37:48.307Z doc = await User.findOneAndUpdate({ _id: doc._id }, { name: 'test3', age:32,gender'Male' }, { new: true }); console.log(doc.createdAt); // 2022-02-26T16:37:48.244Z console.log(doc.updatedAt); // 2022-02-26T16:37:48.366Z
The createdAt
property is immutable, and Mongoose overwrites any user-specified updates to updatedAt
by default.
let doc = await User.create({ name: 'test' }); console.log(doc.createdAt); // 2022-02-26T17:08:13.930Z console.log(doc.updatedAt); // 2022-02-26T17:08:13.930Z doc.name = 'test2'; doc.createdAt = new Date(0); doc.updatedAt = new Date(0); await doc.save(); // Mongoose blocked changing `createdAt` and set its own `updatedAt`, ignoring // the attempt to manually set them. console.log(doc.createdAt); // 2022-02-26T17:08:13.930Z console.log(doc.updatedAt); // 2022-02-26T17:08:13.991Z // Mongoose also blocks changing `createdAt` and sets its own `updatedAt` // on `findOneAndUpdate()`, `updateMany()`, and other query operations doc = await User.findOneAndUpdate( { _id: doc._id }, { name: 'test3', createdAt: new Date(0), updatedAt: new Date(0) }, { new: true } ); console.log(doc.createdAt); // 2022-02-26T17:08:13.930Z console.log(doc.updatedAt); // 2022-02-26T17:08:14.008Z
If you want to change these property names then you can overwrite these property names as shown below.
const userSchema = new Schema({ name: String }, { timestamps: { createdAt: 'created_at', // Use `created_at` to store the created date updatedAt: 'updated_at' // and `updated_at` to store the last updated date } });
Disabling Timestamps
save()
, updateOne()
, updateMany()
, findOneAndUpdate()
, update()
, replaceOne()
, and bulkWrite()
all support a timestamps
option. Set timestamps: false
to skip setting timestamps for that particular operation.
let doc = await User.create({ name: 'test' }); console.log(doc.createdAt); // 2022-02-26T23:28:54.264Z console.log(doc.updatedAt); // 2022-02-26T23:28:54.264Z doc.name = 'test2'; // Setting `timestamps: false` tells Mongoose to skip updating `updatedAt` on this `save()` await doc.save({ timestamps: false }); console.log(doc.updatedAt); // 2022-02-26T23:28:54.264Z
let doc = new User({ name: 'test' }); // Tell Mongoose to set `createdAt`, but skip `updatedAt`. await doc.save({ timestamps: { createdAt: true, updatedAt: false } }); console.log(doc.createdAt); // 2022-02-26T23:32:12.478Z console.log(doc.updatedAt); // undefined