$ извлечение объекта из массива на основе _id в Mongoose

Я пытаюсь удалить объект из массива на основе его поля _id следующим образом:

(posts — это массив объектов)

    User.findOneAndUpdate(
    { id: req.params.userid },
    { $pull: { 'posts': { 'posts._id': { $eq: req.body.postID } } } },
    { new: true }
 )

Однако он удаляет ВСЕ сообщения в массиве, даже если они имеют разные значения _id, на которые ссылается req.body.postID.

Примечание. Если я попытаюсь выполнить тот же запрос с другим полем, например, с названием сообщения, он будет работать нормально и удалит только это сообщение. Однако мне нужно сделать это по полю _id, чтобы обеспечить уникальность.

Вот как выглядит модель User:

(Я не указываю явно поле _id, оно назначается автоматически)

    let userSchema = new mongoose.Schema({
    id: String,
    displayName: String,
    posts: [
        {
            url: String,
            description: String,
            likes: [String]
        }
    ]
    });

Почему это происходит и какое возможное решение?


person JohnSnow    schedule 12.04.2017    source источник
comment
Когда я выполняю аналогичную операцию, я использую только «_id» вместо «posts._id», когда я указываю, какой объект нужно вытащить.   -  person tomtom    schedule 12.04.2017
comment
На основании помеченного дубликата ваш запрос на обновление должен быть User.findOneAndUpdate( { id: req.params.userid }, { $pull: { 'posts': { _id': req.body.postID } } }, { new: true } )   -  person chridam    schedule 12.04.2017
comment
Хорошо, это работает, не могли бы вы объяснить, почему мой запрос в его нынешнем виде удаляет ВСЕ объекты? в чем причина этого?   -  person JohnSnow    schedule 12.04.2017
comment
Я считаю, что виновником является оператор обновления { $pull: { 'posts': { 'posts._id': { $eq: req.body.postID } } } },, который извлекает все сообщения, поскольку в массиве posts нет документа с ключом posts._id. Подробнее здесь .   -  person chridam    schedule 12.04.2017
comment
@chridam имеет смысл, спасибо   -  person JohnSnow    schedule 12.04.2017