JonRed JonRed - 4 months ago 38x
Node.js Question

Mongoose findByIdAndUpdate not returning correct model

I have an issue I've not seen before with the Mongoose findByIdAndUpdate not returning the correct model in the callback.

Here's the code:

var id = args._id;
var updateObj = {updatedDate:};
_.extend(updateObj, args);

Model.findByIdAndUpdate(id, updateObj, function(err, model) {
if (err) {
logger.error(modelString +':edit' + modelString +' - ' + err.message);
self.emit('item:failure', 'Failed to edit ' + modelString);
self.emit('item:success', model);

The original document in the db looks like this:

_id: 1234
descriptors: Array[2],
name: 'Test Name 1'

The updateObj going in looks like this:

_id: 1234
descriptors: Array[2],
name: 'Test Name 2'

The model returned from the callback is identical to the original model, not the updatedObj.
If I query the db, it has been updated correctly. It's just not being returned from the database.

This feels like a 'stupid-user' error, but I can't see it. Any ideas greatly appreciated.


In Mongoose 4.0, the default value for the new option of findByIdAndUpdate (and findOneAndUpdate) has changed to false (see #2262 of the release notes). This means that you need to explicitly set the option to true to get the new version of the doc, after the update is applied:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...