Проблема с обновлением документа MongoDB с помощью mongoose - PullRequest
0 голосов
/ 28 февраля 2019

У меня проблема с обновлением документа.Когда я обновляю документ с помощью findByIdAndUpdate, он обновляется, но это не то, что я хочу, потому что я действительно не хочу удалять пароль и другие.Я действительно не знаю, почему пароль, userCreated и userModified удаляются, так как findByIdAndUpdate использует $ set.

Тело запроса:

{
    "userProfile": {
        "username": "test",
        "email": "test2",
        "firstName": "Test3",
        "lastName": "Test4"
    }
}

Оригинальный документ:

{
        "_id" : ObjectId("5c77b064cecb8c2eacaacdb4"),
        "userProfile" : {
                "firstName" : "John",
                "lastName" : "Doe",
                "userCreated" : "1551347812064",
                "userModified" : "1551347812064",
                "username" : "johndoe",
                "email" : "john.doe@gmail.com",
                "password" : "$2a$10$qkRYXk4fgFWJ3dVaYDMQM.4TzLIKUz8axf/lJU8HihvQIC6fVj7Jm"
        },
        "userSheets" : [ ],
        "userTemplates" : [ ],
        "__v" : 0
}

Что я хотел:

{
        "_id" : ObjectId("5c77b064cecb8c2eacaacdb4"),
        "userProfile" : {
                "firstName" : "UpdatedName",
                "lastName" : "UpdatedLastname",
                "userCreated" : "1551347812064",
                "userModified" : "1551347812064",
                "username" : "updatedUsername",
                "email" : "updated.email@gmail.com",
                "password" : "$2a$10$qkRYXk4fgFWJ3dVaYDMQM.4TzLIKUz8axf/lJU8HihvQIC6fVj7Jm"
        },
        "userSheets" : [ ],
        "userTemplates" : [ ],
        "__v" : 0
}

Что я получил:

{
        "_id" : ObjectId("5c77b064cecb8c2eacaacdb4"),
        "userProfile" : {
                "firstName" : "UpdatedName",
                "lastName" : "UpdatedLastname",
                "username" : "updatedUsername",
                "email" : "updated.email@gmail.com"
        },
        "userSheets" : [ ],
        "userTemplates" : [ ],
        "__v" : 0
}

Я не знаю, что здесь происходит, но в userProfile остаются только те ключи, которые были у меня по запросу.

Вот два файла и код, которые я использовал с mongoose:

user.js

module.exports.updateUser = function(id, updatedUser, callback) {
    var options = {
        new: true
    };
    User.findByIdAndUpdate(id, updatedUser, options, (err, userAll) => {
        if(err) throw err;
        const user = {
            success: true,
            userProfile: userAll.userProfile
        };
        callback(null, user);
    });
}

users.js

router.route('/profile')
    // Send user account
    .get(passport.authenticate('jwt', {session: false}), (req, res) => {
        res.json({user: req.user});
    })
    // Updates user account
    .put(passport.authenticate('jwt', {session: false}), (req, res) => {
        const username = req.body.userProfile.username;
        const email = req.body.userProfile.email;
        const id = req.user._id;

        User.areUsernameAndEmailAvailable(username, email, id, (err, isAvailable) => {
            if(err) throw err;
            if(isAvailable.success) {
                // If username and email are available, if updates user profile
                const updatedUser = req.body;
                User.updateUser(id, updatedUser, (err, updatedUserAndSuccess) => {
                    if(err) throw err;
                    res.json(updatedUserAndSuccess);
                });
            } else {
                res.json(isAvailable);
            }
        });
    })

Схема:

const UserSchema = Schema({
    userProfile: {
        username: { type: String, require: true },
        email: { type: String, require: true },
        firstName: { type: String, default: '' },
        lastName: { type: String, default: '' },
        userCreated: { type: String, default: Date.now() },
        userModified: { type: String, default: Date.now() },
        password: { type: String, require: true }
    },
    userSheets: [
        {
            sheetName: { type: String },
            sheetDescription: { type: String, default: '' },
            sheetCreated: { type: Date, default: Date.now() },
            sheetModified: { type: String, default: Date.now() },
            status: { type: String, default: 'Not started yet' },
            statusChanged: { type: Date, default: Date.now() },
            sheetContent: {
                itemType: { type: String },
                itemRow: { type: Number },
                itemColumn: { type: Number },
                itemContent: { type: String, default: '' },
                itemDatatype: { type: String },
            }
        }
    ],
    userTemplates: [
        {
            templateName: { type: String },
            templateDescription: { type: String, default: '' },
            templateCreated: { type: Date, default: Date.now() },
            templateModified: { type: Date, default: Date.now() },
            templateContent: [
                {
                    templateItemType: { type: String },
                    templateItemRow: { type: Number },
                    templateItemColumn: { type: Number },
                    templateItemContent: { type: String },
                    templateItemDatatype: { type: String },
                }
            ]
        }
    ]
});

узел: 10.15.0 mongoDB: 4.0.5 mongoose: 5.4.2 express: 4.16.4

1 Ответ

0 голосов
/ 28 февраля 2019

Вы заменяете весь userProfile объект, вам просто нужно обновить только те ключи, которые вы хотите.

Подумайте, если это ваше тело

body = {
    "userProfile": {
        "username": "test",
        "email": "test2",
        "firstName": "Test3",
        "lastName": "Test4"
    }
}

Вы должны передать что-то вроде этого

User.findByIdAndUpdate(id, body.updatedUser)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...