#javascript #node.js #mongodb #mongoose
#javascript #node.js #mongodb #mongoose
Вопрос:
Я пытаюсь обновить некоторые поля вложенного документа mongoose в соответствии с предоставленными ключами из postman req.body.
Я попробовал несколько решений, но безуспешно. Я хотел бы просмотреть req.body и обновить необходимые поля. как я уже пробовал в «// update function»
Вот моя схема.
_id: mongoose.Schema.Types.ObjectId,
profile: {
full_name: {
first_name: String,
last_name: String
},
phone: Number,
email: String,
gender: String,
address: {
city: String,
street: String,
},
occupation: String,
biography: String
},
password: {
type: String,
required: true
},
}, {
timestamps: {
createdAt: 'created_at'
}
})
module.exports = mongoose.model('Assistant', assistantSchema);
Вот мой маршрут обновления, в котором я хотел бы обновить значения
router.patch('/:assistantId', Check_Auth, async (req, res, next) => {
const id = req.params.assistantId;
//update function
const updateParams = req.body;
const set = {};
for (const field of updateParams) {
set['assistant.$.' field.key] = field.value
}
//update
try {
await Assistant.updateOne({
_id: id
}, {
$set: set
}).exec().then(result => {
console.log(result);
res.status(201).json(result)
}).catch(err => {
console.log(err);
res.status(403).json({
errmsg: "Ooh something happen, Not able to update profile try again"
})
})
} catch (err) {
res.status(500).json({
errmsg: err
})
}
});
Вот мои значения из postman
[
{"key": "phone", "value": "651788661"},
{"key": "email", "value": "dasimathias@gmail.com"},
{"key": "city", "value": "douala"},
{"key": "street", "value": "bonaberi"},
{"key": "biography", "value": "just share a little code"}
]
```
Ответ №1:
Учитывая данные, которые вы отправляете в качестве post-запроса, передаваемый объект $set
выглядит следующим образом :
{ 'assistant.$.phone': '651788661',
'assistant.$.email': 'dasimathias@gmail.com',
'assistant.$.city': 'douala',
'assistant.$.street': 'bonaberi',
'assistant.$.biography': 'just share a little code' }
Это несовместимо с вашей схемой, если вы пытаетесь обновить profile
атрибут, вы должны сделать это :
for (const field of updateParams) {
if(field.key == "city") set[`profile.address.${field.key}`] = field.value
else set[`profile.${field.key}`] = field.value
}
Что дает такой объект set
:
{ 'profile.phone': '651788661',
'profile.email': 'dasimathias@gmail.com',
'profile.address.city': 'douala',
'profile.street': 'bonaberi',
'profile.biography': 'just share a little code'
}
Обратите внимание, что city
вложенный внутри address
, поэтому вам нужно получить к нему доступ, вам нужно будет сделать то же самое (условие) для full_name
.
Если вы обновляете массив вложенных документов:
set[`assistant.$.profile.address.${field.key}`]
set[`assistant.$.profile.${field.key}`]