Py学习  »  MongoDB

如何更新MongoDB子文档

jeslin • 4 年前 • 340 次点击  

我对 NODEJS hapi 框架。我需要更新 MongoDB 下面显示的子文档

  {
        "_id" : ObjectId("5bd1a22819e3e84e9dcae197"),

        "userPrivacy" : {

            "bio" : {
                "aboutMe" : "only_me"
            },

            "userGallery" : {
                "album" : "connections",
                "images" : "connections",
                "videos" : "connections"
            }
        },
        "following" : [],
        "followers" : [],
        "invites" : [],
        "referrals" : [],
        "userId" : ObjectId("5bd1a22819e3e84e9dcae196")
    }

这是我的用户模式 我需要更新里面的所有文件 userPrivacy ( "bio" ,"userGallery" )

我已经为以下内容编写了控制器:

exports.updatePrivacyDefaults = {
    description: 'update default privacy ',

    tags: ['api'],

    auth: {
        mode: 'try',
        strategy: 'session'
    },

    validate: {
        payload: {
            about: Joi.string().required().allow(''),

            album: Joi.string().required().allow(''),
            image: Joi.string().required().allow(''),
            video: Joi.string().required().allow(''),
        },
        failAction: (request, h, error) => {
            request.yar.flash('error', error.details[0].message);
            return h.redirect('/settings').takeover();
        }
    },

    handler: async (request, h) => {
        try {

            if (request.auth.isAuthenticated) {

                // let userDetails = request.auth.credentials;
                let incomingData = {
                    aboutMe: request.payload.about,                        

                    album: request.payload.album,
                    images: request.payload.image,
                    videos: request.payload.video,
                };
                try {
                    if (incomingData) {
                        console.log('data to update = ', incomingData);
                        let settingsUpdate = await settingHelper.updatePrivacySettings(request.auth.credentials._id, incomingData);
                        if (settingsUpdate.statusCode === 200) {
                            let UpdateData = settingsUpdate.userData;
                            request.yar.flash('success', UpdateData.message);
                            return h.redirect('/settings/privacy_settings');
                        }
                        // return h.view('setting/privacy_settings',{ user: userDetails});
                    }

                } catch (error) {
                    logger.error(error);
                    request.yar.flash('error', error.message);
                    return h.redirect('/lounge');
                }

                // return h.view('setting/privacy_settings',{ user: userDetails});             
            }
            else {
                return h.redirect('/login');
            }
        } catch (error) {
            logger.error(error);
        }
    }
};

数据库操作通过以下方式完成:

exports.updatePrivacySettings = async (user_id, incomingData) =>{
    return new Promise (async(resolve, reject) => {
        let updatedPrivacyData = await UserDetails.findOneAndUpdate({
            userId : user_id,
            incomingData
        });
        if (updatedPrivacyData) {
            return resolve ({
                statusCode : 200,
                userData : updatedPrivacyData
            });
        }
    });
};

我知道不起作用,因为我正试图更新文档中的文档 任何人,请帮我解决。我花了近2天的时间来解决这个问题,但没有结果。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38363
 
340 次点击  
文章 [ 1 ]  |  最新文章 4 年前
frhd
Reply   •   1 楼
frhd    5 年前

Mongo 不知道该怎么办 incomingData . 需要指定要更新的字段。在这种情况下,您可以执行以下操作:

    let updatedPrivacyData = await UserDetails.findOneAndUpdate({
        { userId : user_id }, // query
        { userPrivacy.bio.aboutMe : incomingData.aboutMe, // data to update
          userGallery.album : incomingData.album,
          userGallery.images : incomingData.image,
          userGallery.videos : incomingData.video }
    });

另请参见 mongoose api docs 对于 findOneAndUpdate

您一定要研究使用模式:

https://mongoosejs.com/docs/guide.html

https://mongoosejs.com/docs/api.html#Schema