/timestamp-mongoose

Mongoose plugin that automatically adds createdAt and updatedAt date properties

Primary LanguageJavaScriptMIT LicenseMIT

Mongoose Timestamps Plugin

Build Status Dependency Status devDependency Status Downloads Monthly Downloads Total

Fork of mongoose-timestamp add some feature and fix some open issues.

Simple plugin for Mongoose which adds createdAt and updatedAt date attributes that get auto-assigned to the most recent create/update timestamp.

Installation

npm install timestamp-mongoose

Usage

var timestamps = require('timestamp-mongoose');
var UserSchema = new Schema({
    username: String
});
UserSchema.plugin(timestamps);
mongoose.model('User', UserSchema);
var User = mongoose.model('User', UserSchema)

The User model will now have createdAt and updatedAt properties, which get automatically generated and updated when you save your document.

var user = new User({username: 'Prince'});
user.save(function (err) {
  console.log(user.createdAt); // Should be approximately now
  console.log(user.createdAt === user.updatedAt); // true
  // Wait 1 second and then update the user
  setTimeout( function () {
    user.username = 'Symbol';
    user.save( function (err) {
      console.log(user.updatedAt); // Should be approximately createdAt + 1 second
      console.log(user.createdAt < user.updatedAt); // true
    });
  }, 1000);
});

findOneAndModify (mongoose >= 4.0.1)

Mongoose 4.0.1 added support for findOneAndModify hooks. You must the mongoose promise exec for the hooks to work as mongoose uses mquery when a callback is passed and the hook system is bypassed.

User.findOneAndUpdate({username: 'Prince'}, { password: 'goatcheese' }, { new: true, upsert: true })
            .exec(function (err, updated) {
                console.log(user.updatedAt); // Should be approximately createdAt + 1 second
                console.log(user.createdAt < user.updatedAt); // true
            });

You can specify custom property names by passing them in as options like this:

mongoose.plugin(timestamps,  {
  createdAt: 'createdAt',
  updatedAt: 'updatedAt'
});

Any model's updatedAt attribute can be updated to the current time using touch().