![](/img/trans.png)
[英]How to update subdocument and delete single object of array in subdocument?
[英]how to find a subdocument as array and after inserting a new subdocument?
我已經搜索過類似的案例,但我無法在以下代碼片段中找出問題所在。
我的架構是這樣的:
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);
問題在於嘗試向 teamModelSchema 內的 members 數組添加新項目。
它返回“TypeError:無法讀取未定義的屬性'push'”
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 status 和 json 對象的函數。
find()
返回文檔數組teamInfo
變量是數組members
屬性使用findOne
獲取特定文檔或通過索引從數組中選擇特定文檔(例如teamInfo[0].members.push
)。
@萊米克斯。 在了解了您的幫助並嘗試了一段時間后,有效的解決方案如下:
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);
}
)};
}
);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.