обновление данных в mongodb с помощью nodejs

#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)
          })
        }
      )
})}```