как найти вложенный документ в виде массива и после вставки нового вложенного документа? - PullRequest
0 голосов
/ 20 января 2020

Я искал похожие случаи, но мне не удалось выяснить, где проблема в следующем фрагменте кода.

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

var mongoose = require('mongoose');

var teamMemberModelSchema = new mongoose.Schema({
    "email": {
        "type": String,
        "required": true,
        "min": 5,
        "max": 20
    },
    "name": {
        "type": String,
        "required": true,
        "min": 5,
        "max": 20
    },
    "role": {
        "type": String,
        "required": true,
        "min": 20,
        "max": 50
    },
    "twitter": {
        "type": String,
        "required": true,
        "min": 20,
        "max": 50
    },
    "facebook": {
        "type": String,
        "required": true,
        "min": 20,
        "max": 50
    },
    "linkedin": {
        "type": String,
        "required": true,
        "min": 20,
        "max": 50
    },
});

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

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

проблема приходит при попытке добавить новый элемент в массив members внутри teamModelSchema.

Возвращает «TypeError: Невозможно прочитать свойство 'pu sh' of undefined"

module.exports.addTeamMember = function (req, res) {

    TeamModel.find().select("members").exec(
        function (err, teamInfo) {
            if (err) {
                responseUtilities.sendJsonResponse(res, err, teamInfo);
            } else {
                console.log(teamInfo);

                teamInfo.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
                });

                teamInfo.save(function (err, teamInfo) {
                    var thisMember;
                    if (err) {
                        responseUtilities.sendJsonResponse(res, err, teamInfo);
                    } else {
                        thisMember = teamInfo[teamInfo.length - 1];
                        responseUtilities.sendJsonResponse(res, err, teamInfo);
                    }
                });

            }
        }
    );

};

У меня есть пробовал несколько вариантов, но никто не дал желаемого результата.

Учитывая этот сценарий, как я могу добавить новый элемент в члены?

PS: sendJsonResponse - это только функция, которая выполняет статус res и json объект.

Ответы [ 2 ]

0 голосов
/ 20 января 2020

@ Lemix. После понимания вашей помощи и некоторого времени попыток, решение, которое сработало, выглядит следующим образом:

module.exports.addTeamMember = function (req, res) {

    TeamModel.find( TeamModel ).exec(
        function (err, teamInfo) {
            if (err) {
                responseUtilities.sendJsonResponse(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 membersLength = teamInfo[0].members.length - 1;
                var thisMember;
                thisMember = teamInfo[0].members[membersLength];

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

                 TeamModel.updateOne(doc, options,function (err, teamInfo) {
                    if (err) {
                        data = teamInfo;
                    }
                    else {
                        data = thisMember;
                    }
                    responseUtilities.sendJsonResponse(res, err, data);
                 }
                )};
            }
        );
};
0 голосов
/ 20 января 2020
  1. find() возвращает массив документов
  2. teamInfo переменная является массивом
  3. Массив no содержит members свойство

Использование findOne чтобы получить указанный c документ или выбрать указанный c документ из массива по индексу (например, teamInfo[0].members.push).

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