簡體   English   中英

用貓鼬更新MongoDB文檔的問題

[英]Problem with updating MongoDB document with mongoose

我在更新文檔時遇到問題。 當我使用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中僅保留了我應要求提供的密鑰。

這是我與貓鼬一起使用的兩個文件和代碼:

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貓鼬:5.4.2快遞:4.16.4

您將替換整個userProfile對象,只需要更新所需的鍵。

考慮一下這是否是你的身體

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

你應該通過這樣的事情

User.findByIdAndUpdate(id, body.updatedUser)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM