Удаление одного элемента из массива с помощью mongoose

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #экспресс #mongoose

Вопрос:

Я новичок в веб-разработке и создаю приложение todo. У меня есть следующая схема и модель:

 const tdSchema = new mongoose.Schema({
  category: {
    type: String,
    required: true,
    unique: true
  },
  tds: {
    type: [{
      type: String
    }]
  }
});
const ToDo = mongoose.model("ToDo", tdSchema);
  

Вот пример документа:

 { "_id" : ObjectId("5f7e2c3d1a151704382ce109"), 
"todos" : [ "Update Resume", "Apply for jobs" ], 
"category" : "Career", "__v" : 0 }
  

Я хотел бы удалить «Обновить резюме» из массива «todos», оставив все остальное в документе как есть.

Как мне это сделать с помощью Mongoose JS?

Ответ №1:

Сначала найдите документ:

 const doc = await ToDo.findOne({ _id: "5f7e2c3d1a151704382ce109" });
console.log(doc);  // optional (used to illustrate how code works)
  

Это будет регистрироваться:

 { "_id" : ObjectId("5f7e2c3d1a151704382ce109"), 
"todos" : [ "Update Resume", "Apply for jobs" ], 
"category" : "Career", "__v" : 0 }
  

Отсюда просто откройте «todos» и удалите из него так же, как вы удаляете из обычного массива JavaScript.

 doc.todos = doc.todos.filter(e => e !== "Update Resume");
  

Затем сохраните документ:

 const updated = await doc.save();
console.log(updated);  // optional (used to illustrate how code works)
  

И вы получите это в своем журнале:

 { "_id" : ObjectId("5f7e2c3d1a151704382ce109"), 
"todos" : [ "Apply for jobs" ], 
"category" : "Career", "__v" : 0 }
  

Ответ №2:

Основываясь на ответе @Bilal Saleem, если вы хотите запустить только один запрос и убедиться, что он работает, если несколько человек одновременно делают запросы, вы можете сделать это в запросе обновления с помощью $pull оператора.

Оператор $pull используется для удаления элементов из массива mongodb и поддерживает условия запроса для элементов, которые вы хотите извлечь.

 const doc = await ToDo.updateOne(
  { _id: "5f7e2c3d1a151704382ce109" },
  {
    $pull: {
      todos: "Update resume",
    }
  }
);
  

В приведенном выше случае это приведет $pull к удалению из todos массива и удалению любых элементов, равных "Update resume"