aBloomer aBloomer - 1 day ago 4
Node.js Question

Mongoose: findOneAndUpdate doesn't return updated document

Below is my code

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var Cat = mongoose.model('Cat', {
name: String,
age: {type: Number, default: 20},
create: {type: Date, default: Date.now}
});

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
if(err){
console.log("Something wrong when updating data!");
}

console.log(doc);
});


I already have some record in my mongo database and I would like to run this code to update name for which age is 17 and then print result out in the end of code.

However, why I still get same result from console(not modify the name) but when I go to mongo db command line and type "db.cats.find();". The result was modify.

Then I go back to run this code again and the result is modified.

My question is: the data was modify but why I still got original data at first time when console.log it.

Answer

The default is to return the unaltered document. If you want the new, updated document to be returned you have to pass an additional argument named new with the value true.

http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

Query#findOneAndUpdate

function(error, doc) {
  // error: any errors that occurred
  // doc: the document before updates are applied if `new: false`, or after updates if `new = true`
}

Available options

new: bool - if true, return the modified document rather than the original. defaults to false (changed in 4.0)

So, if you want the updated result in the doc variable:

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});
Comments