In my database collections, I want to update a \'lastChanged\' field every time the record is updated with the current datetime. I want it to be in the same format as mongoo
In a few days Mongo is going to announce new 2.6 version (currently you can download experimental 2.5.x version). Among many other features you can use $currentDate which is going to do exactly the thing you want:
db.users.update(
<criteria>,
{
$currentDate: { yourField: true},
}
)
If you just want an ISO String use:
new Date().toISOString()
One way of accomplishing this is to use Mongoose Middleware and update the field pre-save.
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
//schema
var SomethingSchema = new Schema({
text: {type: String},
createdAt: {type: Date, default: Date.now},
updatedAt: {type: Date, default: Date.now}
});
//middle ware in serial
SomethingSchema.pre('save', function preSave(next){
var something = this;
something.updatedAt(Date.now());
next();
});
It seems, however, that the middleware is not always invoked:
Notes on findAndUpdate()
preandpostare not called for update operations executed directly on the database, includingModel.update,.findByIdAndUpdate,.findOneAndUpdate,.findOneAndRemove,and.findByIdAndRemove.order to utilizepreorpostmiddleware, you shouldfind()the document, and call theinit,validate,save, orremovefunctions on the document. See explanation.
Update: See this question "add created_at and updated_at fields to mongoose schemas"
The middleware function is a good approach, however, it should be
SomethingSchema.pre('save', function preSave(next){
var something = this;
something.updatedAt = Date.now();
next();
});
Since something.updateAt is not a function.