繁体   English   中英

如何更新mongodb子文档

[英]How to update mongodb sub-document

我对NODEJS hapi框架很NODEJS 我需要更新下面显示的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天的时间来解决它,但没有结果

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 }
    });

另请参阅有关findOneAndUpdate 猫鼬API文档

您绝对应该考虑使用Schema:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM