#javascript #node.js #mongodb #mongoose
Вопрос:
У меня есть Node.js приложение, в котором я пытаюсь удалить объект из массива при попадании в конечную точку API. До сих пор мне не удавалось заставить его обновить/удалить объект. В настоящее время приведенный ниже запрос возвращается без ошибок, но при регистрации в моей базе данных я все еще вижу его. Ниже приведен мой запрос и основной ответ (я добавлю больше, но это выходит за рамки этого вопроса). Я также включил образец своей модели данных. В приведенной ниже модели данных я пытаюсь удалить весь объект из массива foo, так как он больше не нужен. Код
const ID = req.params.id
await FooBar.updateOne({foo: {$elemMatch: {v_code: ID}}}, { $pull: {v_code: ID}}, (err) => {
if(err) return res.json({success: false, err})
return res.json({success: true, id: ID})
})
Модель данных
{
bar: [
{
foo: [
{
v_code: <>
_id: <>
}
]
}
]
}
Я уверен, что об этом спрашивали в других вопросах, но ни один из них не относится к моей модели данных. Я попытался собрать воедино несколько сообщений SO, и именно так я получил $elemmatch и части $pull моего запроса, и до сих пор мне не везло
Комментарии:
1. Ознакомьтесь с примером в документах , чтобы узнать количество сопоставленных и измененных документов. Соответствует ли ваш запрос каким-либо документам?
2. @Joe Это должно соответствовать документу, я проверил консоль mongo atlas и вижу ту, которая имеет правильное значение для ключа, который я пытаюсь найти. Я просто сделал, как вы предложили, и попытался увидеть количество возвращенных документов, оно показывает 0. Не знаю почему, я подтвердил, что ключ/значение-это vaild, хотя, может быть, потому, что элемент не верхнего уровня? Я не могу нацелиться
v_code
непосредственно наelemmeatch
него, так как он также появляется (другое значение) в массиве старых значений дляfoo
3. Операторы запросов MongoDB зависят от типа. Убедитесь, что тип
ID
соответствует типу данных в базе данных. Судя по вложенной модели данныхfoo
bar
, вы пытались сопоставить{"bar.foo.v_code": ID}
ее ?4. @Joe Оба строки так думали и только что провели небольшой тест консоли. войдите в систему, чтобы подтвердить, и я был прав
5. Может быть, селектор неверен для запроса?
Ответ №1:
попробуйте выполнить следующую команду:
db.collection.updateOne(
{
"bar.foo.v_code": ID
},
{
$pull: { bar: { foo: { $elemMatch: { v_code: ID } } } }
}
)