#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"]
он удалит ваш ключ, а затем вы сможете манипулировать другими ключами