Mongoose findByIdAndUpdate尝试覆盖_id

时间:2018-03-15 15:56:58

标签: node.js mongodb mongoose

这是我的createUpdate函数

const createUpdateProfile = (req, res) => {
    //Fillout Schema
    let uuid = req.user.identities[0].id;
    let provider = req.user.identities[0].provider;
    let email = req.user.email;
    let firstName = req.user.name.split(' ').slice(0, -1).join(' ');
    let lastName = req.user.name.split(' ').slice(-1).join(' ');
    let pictureUrl = req.user.picture;
    let profileToSafe = new Profile({
        uuid: uuid,
        provider: provider,
        email: email,
        firstName: firstName,
        lastName: lastName,
        pictureUrl: pictureUrl
    });
    let profileToUpdate = new Profile({
        email: email,
        firstName: firstName,
        lastName: lastName,
        pictureUrl: pictureUrl
    });
    //createUpdate
    Profile.findOne({ uuid }).then(object => {
        if (object !== null) {
            Profile.findByIdAndUpdate(object._id, profileToUpdate, function (err, raw) {
                if (err) {
                    console.log('callback -> err', err);
                }
                console.log('callback -> raw', raw);
                res.status(200).send('successful operation update');
            });
        } else {
            profileToSafe.save();
            res.status(200).send('successful operation create');
        }
    })
}

尽管更新了现有记录,但一切正常。

问题在于此代码区域:

Profile.findByIdAndUpdate(object._id, profileToUpdate, function (err, raw) {
                    if (err) {
                        console.log('callback -> err', err);
                    }
                    console.log('callback -> raw', raw);
                    res.status(200).send('successful operation update');
                });

我不知道为什么,但是它试图覆盖_id字段,即使它没有在profileToUpdate架构中定义。

1 个答案:

答案 0 :(得分:1)

阅读this后,确实有用。

诀窍是在尝试更新之前手动删除id。

Profile.findOne({ uuid }).then(object => {
    if (object !== null) {
        var upsertData = profileToUpdate.toObject();
        delete upsertData._id;
        Profile.update({ uuid }, upsertData, { upsert: true }, function (err, raw) {
            if (err) {
                console.log('callback -> err', err);
            }
            console.log('callback -> raw', raw);
            res.status(200).send('successful operation update');
        });
    } else {
        profileToSafe.save();
        res.status(200).send('successful operation create');
    }
})