Node.js – Mongoose Returned Model can’t be updated

mongodbmongoosenode.js

I'm pretty new to Mongoose/Mongo and node.js, so I suspect this is just a misunderstanding on my side, but…

The code sample below is the smallest failing example, not specifically my use case.

var User = app.db.model('User');
User.find({email: 'm8@test.com'}, function (err, models) {
    models[0].update(function(err, mod) {
        console.log(err.message)
    });
});

This results in the following error: After applying the update to the document {_id: ObjectId('54647402cb955748153ea782') , …}, the (immutable) field '_id' was found to have been altered to _id: ObjectId('546d9e0e539ed9ec102348f9')

Why is this happening? I would have thought calling update on the model returned from the initial find would have been fine.

Please note: in my use case there are things happening in between the find and the update. Specifically, I'm doing something similar to:

model.property.push(objectId)

Which I then want to commit via the update.

I'm sure this is a straight-forward issue, but I can't see anywhere in the docs I may be getting it wrong.

All help appreciated.

UPDATE:

What I actually needed to do was:

var User = app.db.model('User');
User.find({email: 'm8@test.com'}, function (err, models) {
    models[0].save(function(err, mod) {
        console.log(err.message)
    });
});

Using 'save' rather than 'update'

Best Answer

I don't know if I understood

Find and Update ( for example using express )

var email = req.params.email;
    User.find({email:email}, req.body, function(err,user){
        if(err){
            throw err;
        }

        //you do stuff like this
        var obj = {
            password:'new pass',
            username:'username'
        }
        //use save if you want validate
        User.update(user[0],obj,function(err, mod) {
            console.log(err)
        });      
    });

Only Update: ( for example using express )

User.update({email:email}, req.body, {}, function(err,user){
    if(err){
        throw err;
    }
    res.send(200, {
        message : 'User updated ' + user
    });
});

Remember that:

A model is a compiled version of the schema.

I hope this can help you