С учетом этой модели, как лучше всего добавить новый элемент в виде вложенного массива (mon goose)? - PullRequest
0 голосов
/ 16 марта 2020

У меня возникла ситуация, когда по электронной почте я хотел бы найти нужную запись и обновить ее поле. Эта запись является элементом вложенного массива.

Код ниже работает. Я нашел способ заставить его работать. Но это звучит немного странно и немного некрасиво, и его нелегко поддерживать, если партнеру необходимо его развивать. Есть 3 запроса. Я не думаю, что мне нужно, чтобы все они достигли того, чего я хочу. Давайте подведем итог, что делает этот метод:

  • Первый запрос проверяет, есть ли пользователь с предоставленной электронной почтой.
  • Второй получает всю модель документа
  • Как только модель документа найдена, создается массив, и его данные заполняются в соответствии с данными req.body, предоставленными пользователем
  • . последний запрос использует исходные и предоставленные данные для вставки нового элемента во вложенный массив

Итак, мне нужно его реорганизовать, но я боюсь нарушить работающий код.

Любой совет?

Я также копирую схему модели.

Схема модели

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.addTeamMember = function (req, res) {

    var email = req.body.email;
    var query = { "members.email": email };
    // checks if there is already a email
    TeamModel
        .find(query, { 'members.$': 1 })
        .exec(function (err, content) {
            if (content.length > 0 && content[0].members[0].email.length > 0) {
                responseUtilities.sendJSON(res, err, { "message": teamMsg.teamMemberEmailInUseError }, 409);
            } else {
                // gets the teaminfo
                TeamModel.find(TeamModel).exec(
                    function (err, teamInfo) {
                        if (err) {
                            responseUtilities.sendJSON(res, err, teamInfo);
                        } else {

                            teamInfo[0].members.push({
                                email: req.body.email,
                                name: req.body.name,
                                role: req.body.role,
                                twitter: req.body.twitter,
                                facebook: req.body.facebook,
                                linkedin: req.body.linkedin
                            });

                            var doc = {
                                id: teamInfo[0].description.id
                            };
                            var update = {
                                $set: {
                                    description: teamInfo[0].description,
                                    headline: teamInfo[0].headline,
                                    title: teamInfo[0].title,
                                    members: teamInfo[0].members,
                                }
                            };

                            //includes the new member
                            TeamModel.updateOne(doc, update, function (err) {
                                var message = teamMsg.teamMemberCreatedSuccess;
                                responseUtilities.sendJSON(res, err, { "message": message });
                            })
                        };
                    }
                );
            }
        });

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...