Учитывая эту модель, как удалить вложенный элемент массива с помощью updateOne (mon goose)? - PullRequest
2 голосов
/ 14 марта 2020

Я пытаюсь удалить элемент массива методом updateOne, но мой запрос не соответствует правильной записи в структуре модели, которая у меня есть. Получив электронное письмо, я хотел бы найти элемент массива с предоставленным письмом и вытащить его, удалить его. (Нет элемента массива с тем же адресом электронной почты)

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

var mongoose = require('mongoose');

var teamMemberModelSchema = new mongoose.Schema({
     _id: false,
    "email": {
        "type": String,
        "required": true,
        "minlenght": 5,
        "maxheight": 50
    },
    "name": {
        "type": String,
        "required": true,
        "minlenght": 5,
        "maxheight": 256
    },
    "role": {
        "type": String,
        "required": true,
        "minlenght": 20,
        "maxheight": 256
    },
    "twitter": {
        "type": String,
        "required": true,
        "minlenght": 1,
        "maxheight": 100
    },
    "facebook": {
        "type": String,
        "required": true,
        "minlenght": 1,
        "maxheight": 100
    },
    "linkedin": {
        "type": String,
        "required": true,
        "minlenght": 1,
        "maxheight": 100
    },
});

var teamModelSchema = new mongoose.Schema({
    "title": {
        "type": String,
        "required": true,
        "minlenght": 5,
        "maxheight": 20
    },
    "headline": {
        "type": String,
        "required": true,
        "minlenght": 5,
        "maxheight": 30
    },
    "description": {
        "type": String,
        "required": true,
        "minlenght": 5,
        "maxheight": 80
    },
    "members": [teamMemberModelSchema]
}, { collection: 'team' });

teamModelSchema.set('collection', 'team');
mongoose.model('team', teamModelSchema)

И я пытаюсь использовать следующий подход:

module.exports.removeMember = function (req, res) {
  const email = req.params.email;
  const query = { "members.email": email };
  const pull = { $pull: { "members.$.email": email } };

  try {
    var message = teamMsg.teamMemberRemoveSuccess;

    TeamModel.updateOne(query, pull);

    responseUtilities.sendJSON(res, false, { message: message });
  } catch (err) {
    console.log(err.message);
    responseUtilities.sendJSON(res, err, { message: err.message });
  }
};

Выполняется без ошибок, но ничего не обновляется.

Я пробовал некоторые другие альтернативы с "FindOneAndUpdate" и "FindOneAndRemove", но не смог найти решение.

Любые идеи

Ответы [ 3 ]

1 голос
/ 14 марта 2020

Для этой задачи вы можете использовать findOneAndUpdate с оператором $pull.

Для удаления элементов из массива документов вы можете проверить MongoDb docs

You необходимо использовать блок await или then для запроса. Я использовал await и сделал функцию асинхронной, добавив ключевое слово async. Нам также нужен пустой объект запроса.

Я также добавил опцию new: true, чтобы вернуть обновленный объект, чтобы проверить, удален ли элемент.

Вам нужно обработать случай, когда ни один документ не соответствует, я добавил для вас TODO.

module.exports.removeMember = async function(req, res) {
  const email = req.params.email;
  const query = {};

  const pull = {
    $pull: {
      members: {
        email: email
      }
    }
  };

  const options = {
    new: true
  };

  try {
    var message = teamMsg.teamMemberRemoveSuccess;

    const result = await TeamModel.updateOne(query, pull, options);

    console.log(result);

    if (!result) {
      //TODO: return 400-Bad Request or 404 - Not Found
    } else {
      responseUtilities.sendJSON(res, false, { message: message });
    }
  } catch (err) {
    console.log(err.message);
    responseUtilities.sendJSON(res, err, { message: err.message });
  }
};
0 голосов
/ 14 марта 2020

попробуйте этот запрос:

db.collection.update(
    { 'members.email': 'email@address' },
    { $pull: { members: { email: 'email@address' } } },
    { multi: true }
)
0 голосов
/ 14 марта 2020

Попробуйте использовать метод update() и async/await:

module.exports.removeMember = async function (req, res) {

    const email = req.params.email;
    console.log(`email = ${email}`)   // Make sure correct value is coming thru

    const query = { "members.email": email };
    const pull = { $pull: { "members.$.email": email } };
    const options = { multi: true }

    try {

        var message = teamMsg.teamMemberRemoveSuccess;

        await TeamModel.update( query, pull, options );


        responseUtilities.sendJSON(res, false, { "message": message });

    } catch (err) {
        console.log(err.message);
        responseUtilities.sendJSON(res, err, { "message": err.message });
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...