Мангуст удаляет весь документ вместо удаления элемента из вложенного массива

#javascript #node.js #mongoose

#javascript #node.js #mongoose

Вопрос:

У меня есть такая структура :

 {
    name : 'name1'
    projects : [
      {projectId : 123 , ...more},
      {projectId : 124 , ...more},
      {projectId : 125 , ...more},
    ]
  }
  
  {
    name : 'name2'
    projects : [
      {projectId : 126 , ...}
      {projectId : 127 , ...}
    ]
  }
  

Чтобы найти единственную запись на основе ProjectID , я использую следующий код :

    const project = await ClientManager.findOne({
  project: {$elemMatch: { projectId: projectId } },
}, {'project.$': 1});
  

Это работает. Но теперь я хочу удалить один проект из массива проектов вместо того, чтобы просто находить документ.

Я попытался добавить remove в конце, но это удаляет весь мой документ. Я просто хочу удалить один проект, который соответствует заданному ProjectID из массива проектов:

 const project = await ClientManager.findOne(
  {
    project: { $elemMatch: { projectId: projectId } },
  },
  { 'project.$': 1 }
).remove();
  

Ответ №1:

Чтобы удалить один элемент из массива проектов, вы можете использовать $pull

 await ClientManager.findOneAndUpdate(
  { "projects.projectId": projectId },
  { $pull: { projects: {projectId: projectId} } }
);
  

Кроме того, вам не нужно использовать $elemMatch для поиска документа, поскольку вы просто проверяете наличие одного поля, т.Е. ProjectID . Вместо этого вы можете выполнить этот запрос

 const project = await ClientManager.findOne({
  "projects.projectId": projectId
}, {"project.$": 1});
  

Комментарии:

1. Ваше решение удаляет всю коллекцию, включая имя и т. Д

2. Я думаю, вы хотите просто удалить элемент из этого массива проектов, а не из документа?

3. Позвольте мне также отредактировать мой ответ и вопрос, потому что вы упомянули, что он удаляет всю коллекцию, что неверно