Не удалось удалить элемент из массива с помощью Mongoose / updateOne

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

https://mongoplayground.net/p/iqJki-mnHSJ