Невозможность извлечь из вложенного массива - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть этот запрос

router.delete('/:_id', async (req, res) => {
  const {_id} = req.params;
  const errors = [];
  console.log(_id);
  await Promise.all([
    // Pon.findOneAndDelete({_id}).catch((e) => {
    //   console.log(e);
    //   errors.push('Something went wrong. Pon was not deleted');
    // }),
    // ^^^^^^^^^ this part worked. Wanted to just test the other query
    User.findOneAndUpdate({_id: req.user._id}, {$pull: {pons: {_id}}}).catch((e) => {
      console.log(1, e);
      errors.push('Something went wrong. Pon reference was not deleted from user');
    }),
  ]);
  if (errors.length > 0) {
    console.log(2, errors);
    res.json({ok: false, errors});
  } else {
    res.json({ok: true});
  }
});

Я просто пытаюсь удалить элемент из объекта пользователя. Вот объект

{
    "_id": {
        "$oid": "5ea2d8cffe35b93e84f7962b"
    },
    "pons": [
        {
            "$oid": "5ea98b181a2be04ec87aa710" // this is what I want to remove
        }
    ],
    "email": "test@test.tes",
    "password": "$2a$12$VJ0MkcGUs42pikT42qLpyOb0Sd53j9LXH8dY9RdR/GcmUVzJoP8gi",
    "__v": 0
}

Этот запрос не выдает никаких ошибок, catch не перехватывает ничего, поэтому я не знаю, что я делаю неправильно. Я попытался сделать {pons: _id} вместо {pons: {_id}}, но не повезло.

_id правильно. Проверено с console.log.

Чего мне не хватает?

1 Ответ

2 голосов
/ 29 апреля 2020

_id это просто String. Если вы хотите сопоставить ObjectId, вы должны обернуть его так: mongoose.Types.ObjectId(_id)

const ObjectId = mongoose.Types.ObjectId

User.findOneAndUpdate(
  { _id: ObjectId(req.user._id) },
  { $pull: { pons: ObjectId(_id) } }
)

Поскольку вы запрашиваете _id, вы также можете использовать User.findByIdAndUpdate(), что обернет req.user._id с ObjectId для вас.

const ObjectId = mongoose.Types.ObjectId

User.findByIdAndUpdate(req.user._id, { $pull: { pons: ObjectId(_id) } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...