#javascript #node.js #mongodb #mongoose #mongodb-query
#javascript #node.js #mongodb #мангуст #mongodb-запрос
Вопрос:
Я новичок в NodeJS и MongoDB, использую mongoose и пытаюсь обновить данные продукта с помощью этого кода
return new Promise((resolve, reject) => {
mongoose.connect(DB_URL, { useUnifiedTopology: true, useNewUrlParser: true }).then(() =>
feature = new FaeturesModel({
name: featureName,
description: featureDesc,
catagory: featureCatagory,
price: featurePrice ' IQD' ,
image: featureImage,
dateOfCreation: new Date().toJSON().slice(0, 10).replace(/-/g, '/')
})).then(() => {
return FaeturesModel.updateOne({"_id" : id} , {$set : {feature}})
.then(()=> feature.save())
.then(() => {
mongoose.disconnect();
resolve()
}).catch(err => {
mongoose.disconnect();
reject(err)
})
}
)
})}
проблема в том, что запись добавляется как новая без удаления старой
Ответ №1:
При сохранении документа создается новый. Если вы хотите что-то обновить:
await Model.updateOne({ _id: doc._id }, { $set: { name: 'foo' } })
В основном удалите .then(()=> feature.save())
, и это сработает.
Это из документации.
Редактировать
Извините, я забыл упомянуть, что при обновлении вы не создаете новый документ, подобный этому new Feature()
, вместо этого вы говорите:
Model.updateOne({ _id: id }, { $set: req.body }).then(res => {
// do stuff
})
Потому new Feature()
что создается новый документ с _id
прикрепленным к нему новым, поэтому вы не можете обновить существующий документ.
Надеюсь, теперь все ясно: D
РЕДАКТИРОВАТЬ 2
Это не часть вопроса, но используйте
const schema = new Schema({
...
},
{ timestamps: true });
вместо этого в вашей схеме
dateOfCreation: new Date().toJSON().slice(0, 10).replace(/-/g, '/')
Проще сохранить дату создания.
Комментарии:
1. я удалил его и выдал сообщение об ошибке, в котором говорится, что выполнение обновления пути ‘_id’ приведет к изменению неизменяемого поля ‘_id’, и из приведенного выше кода я не обновлял _id
2. Попробуйте использовать
req.body
вместоnew Feature()
при обновлении. ИтакFaeturesModel.updateOne({"_id" : id} , {$set : {req.body}})
3. спасибо, брат, это сработало, и я опубликую код ниже
Ответ №2:
exports.updateFeature = (id,featureName, featureCatagory, featurePrice , featureDesc , featureImage) => {
return new Promise((resolve, reject) => {
mongoose.connect(DB_URL, { useUnifiedTopology: true, useNewUrlParser: true }).then(() =>
feature =({
name: featureName,
description: featureDesc,
catagory: featureCatagory,
price: featurePrice ' IQD' ,
image: featureImage,
dateOfCreation: new Date().toJSON().slice(0, 10).replace(/-/g, '/')
})).then(() => {
return FaeturesModel.updateOne({'_id' : id} , {$set : feature})
.then(() => {
mongoose.disconnect();
resolve()
}).catch(err => {
mongoose.disconnect();
reject(err)
})
}
)
})}```