Как обновить вложенный документ mongodb

Я очень новичок в среде NODEJShapi. Мне нужно обновить субдокумент 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 дня на ее решение, но безрезультатно

0
0
42
1

Ответы 1

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

Также см. API мангуста для findOneAndUpdate

Вам обязательно стоит изучить работу со схемами:

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

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

Другие вопросы по теме