[Solved] Mongoose: findOneAndUpdate Not returning updated document

Updated: December 30, 2023 By: Guest Contributor Post a comment

Understanding the findOneAndUpdate Issue

When using the findOneAndUpdate function with Mongoose, it is commonly expected that the operation returns the modified document. However, by default, this function will return the original document that was found before the update was applied. This is often a point of confusion and can lead to unexpected behavior if you’re not aware of the default settings. When developers encounter this, they typically haven’t specified that they want the updated document to be returned.

Solutions

Specifying the Return of the Updated Document

To ensure findOneAndUpdate returns the updated document, we need to set the new option to true. This tells Mongoose to return the modified version of the document rather than the original. Below is a code example demonstrating how you can ensure that your findOneAndUpdate calls return the updated document:

import mongoose from 'mongoose';
const { Schema } = mongoose;

const YourSchema = new Schema({ /* your schema fields */ });
const YourModel = mongoose.model('YourModel', YourSchema);

const query = { /* query criteria */ };
const update = { $set: { /* updated fields */ } };
const options = { new: true };

YourModel.findOneAndUpdate(query, update, options)
  .then(updatedDocument => {
    // Handle the updated document
  })
  .catch(error => {
    // Handle the error
  });

Considering the useFindAndModify Global Option

Beyond the new option, it’s essential to know that as of Mongoose 5.0, findOneAndUpdate() uses MongoDB’s findAndModify() engine by default, which is deprecated. To avoid deprecation warnings and use the findOneAndUpdate function without any issues, you should set the useFindAndModify flag to false globally when connecting to MongoDB. Here is how you do it:

mongoose.connect('yourMongoDBUri', { useFindAndModify: false });

This configuration change helps promote best practices and ensures your codebase is prepared for future compatibility.