#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. Позвольте мне также отредактировать мой ответ и вопрос, потому что вы упомянули, что он удаляет всю коллекцию, что неверно