Удаление пары ключ-значение из схемы mongoose с помощью метода findOneAndUpdate()

#mongodb #mongoose #mongoose-schema

#mongodb #mongoose #mongoose-schema

Вопрос:

Ниже приведен раздел кода :

Profile является объектом mongoose shcema и содержит несколько пар ключ-значение, и функция кода заключается в обновлении профиля с помощью метода findOneAndUpdate, передающего поля профиля, в $set которые содержатся новые пары ключ-значение.

 let profile = await Profile.findOne({ user: req.user.id });
            if (profile) {
                profile = await Profile.findOneAndUpdate(
                    { user: req.user.id },
                    { $set: profileFields },
                    { new: true }
                );
                console.log(profile);
                return res.json(profile);
            }
 

Этот код отлично работает при изменении значения для ключа.

например. Profile.githubusername было abcd и изменяется путем передачи полей профиля (в которых githubusername равно xyz) $set в метод findOneAndUpdate.

Но код завершается с ошибкой, когда пара ключ-значение полностью удаляется.

например. Объект profileFields не содержит ключа githubusername. В таком случае ранее сохраненное ранее значение Profile.githubusername сохраняется.

Но мне нужно, чтобы вся существующая информация для профиля была заменена полями профиля, чтобы, если пара ключ-значение отсутствует в полях профиля, она также удалялась из профиля.

Есть ли способ добиться этого?

TIA

Редактировать : я добавил следующее перед вызовом findOneAndUpdate() . Но это все равно не работает.

 let profile = await Profile.findOne({ user: req.user.id });
            // for (key in profile)
            //     console.log(key);
            for (key in profile) {
                if (Object.keys(profileFields).indexOf(key) === -1) {
                    console.log('missing key: 'key);
                    profileFields[key] = '';
                }
            }
 

Когда я console.log(profile), я получаю:

 {
   skills: [ 'HTML' ],
   _id: 60142f8f9a5bff1f08653478,
   user: 60142dc89a5bff1f08653477,
   company: 'Self Employed',
   bio: 'Useless international',
   status: 'Student or Learning',
   experience: [],
   education: [],
   date: 2021-01-29T15:53:51.693Z,
   __v: 10,
   location: 'Ahemdabad, Gujrat, India',       
   githubusername: 'k'
 }
 

Насколько я понимаю, навыки, _id, пользователь, компания, биография… githubusername — единственные ключи в этом объекте.

Но при запуске for (key in profile) цикла я получаю много других ключей, некоторые из них :

 $__
isNew
errors
$locals
$op
_doc
$init
db
discriminators
schema
collection
$__originalValidate
$__save
$__validate
$__remove
$__deleteOne
$__init
$isMongooseModelPrototype
$__handleSave
save
$__delta
$__version
increment
$__where
remove
delete
 

Как я могу перебирать только пользовательские ключи?

Комментарии:

1. Есть ли причина, по которой вы не можете проверить, является ли значение пары ключ-значение нулевым / пустым, а затем использовать findOneAndDelete?

2. @anthony Для этой функции будет сделано много вызовов, но лишь немногим потребуется полное удаление пары, поэтому я хотел избежать дополнительной работы для каждого вызова

3. @anthony пожалуйста, проверьте отредактированный вопрос

Ответ №1:

Вы можете попробовать:

  delete mongooseObject["$init"] 
 

он удалит ваш ключ, а затем вы сможете манипулировать другими ключами