Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose Returned Model can't be updated

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: '[email protected]'}, 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: '[email protected]'}, function (err, models) {
    models[0].save(function(err, mod) {
        console.log(err.message)
    });
});

Using 'save' rather than 'update'

like image 790
JonRed Avatar asked Nov 21 '14 07:11

JonRed


People also ask

What does findOneAndUpdate return Mongoose?

By default, findOneAndUpdate() returns the document as it was before update was applied. You should set the new option to true to return the document after update was applied.

What does Mongoose model return?

mongoose. model() returns a Model ( It is a constructor, compiled from Schema definitions).

Does Mongoose save return a Promise?

While save() returns a promise, functions like Mongoose's find() return a Mongoose Query . Mongoose queries are thenables. In other words, queries have a then() function that behaves similarly to the Promise then() function. So you can use queries with promise chaining and async/await.


1 Answers

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

like image 138
Barno Avatar answered Sep 24 '22 12:09

Barno