У меня возникла ситуация, когда по электронной почте я хотел бы найти нужную запись и обновить ее поле. Эта запись является элементом вложенного массива.
Код ниже работает. Я нашел способ заставить его работать. Но это звучит немного странно и немного некрасиво, и его нелегко поддерживать, если партнеру необходимо его развивать. Есть 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 });
})
};
}
);
}
});
};