社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

如何更新MongoDB子文档

jeslin • 4 年前 • 359 次点击  

我对 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
 
359 次点击  
文章 [ 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