簡體   English   中英

如何在插入新子文檔后以數組形式查找子文檔?

[英]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 對象的函數。

  1. find()返回文檔數組
  2. teamInfo變量是數組
  3. 數組沒有包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM