#javascript #node.js #mongodb #mongoose #crud
#javascript #node.js #mongodb #мангуст #crud
Вопрос:
Я создаю серверную часть приложения CRUD. В настоящее время у меня есть настройка почтового маршрута /diagrams/update:id
, где я могу переопределить документ MongoDB основным текстом, который я отправляю через Postman.
Я могу успешно обновить документ, но когда я пытаюсь обновить только одни данные внутри документа, все остальное удаляется.
Я хочу, чтобы мой код 1) определял, отличается ли то, что я пытаюсь изменить, от данных в базе данных, 2) обновлял запись, только если она отличается, 3) если изменений нет, не обновляйте и сохраняйте текущие данные в базе данных.
Я попытался сделать что-то вроде
if (diagram.name !== req.body.name) {
diagram.name = req.body.name}
но это означало бы, что я должен писать эту логику для каждого отдельного изменения.
server.js
router.route('/diagrams/update/:id').post((req, res)=> {
mySchema.findById(req.params.id, (err, diagram) => {
if (!diagram)
return next(new Error('Could not load doc!'))
else {
// I tried something like
// if (diagram.name !== req.body.name) {
// diagram.name = req.body.name}
// but that only works one at a time
diagram.name = req.body.name;
diagram.creator = req.body.creator;
diagram.customer = req.body.customer;
diagram.save().then( diagram => {
res.json('Update done!')
}).catch(err => {
res.status(400).send('Update faileddddd')
})
}
})
})
MySchema.js
const mongoose = require( 'mongoose');
const Schema = mongoose.Schema;
let mySchema = new Schema({
name: {
type: String
},
creator: {
type: String
},
customer: {
type: String
}
}, {collection: `fivo`})
Комментарии:
1. Вы передаете
name
,creator
, иcustomer
по каждому запросу? Моя первая мысль о том, почему это удаляет данные, была бы, если это не так, или вы передаете их как пустое или нулевое значение.2.
Object.assign(diagram, req.body)
3. Когда вы передаете just
name
, обновляется только имя. Когда вы передаетеname
,creator
, иcustomer
, да, оно передается как пустое и обновляется до пустого значения. Позже, когда я создаю интерфейс интерфейса, мне нужно, чтобы пользователь мог редактировать каждое поле, только если что-то изменилось. Означает ли это, что мне все равно нужно вводитьname
,creator
, иcustomer
каждый раз?
Ответ №1:
Вы можете сделать что-то вроде этого. Просто передайте все значения, которые будут обновлены в объекте.
let update = async (userId, properties) => {
let user = await Users.findOne({ _id: userId });
// Update all properties.
for(property in properties) {
user[property] = properties[property];
}
user = await user.save();
return user;
}