Mongoose推入子文档

时间:2015-04-19 20:33:57

标签: angularjs mongoose lodash

我在MEAN.js上运行,并且在将新的子文档推送到现有数据库条目时遇到了问题。到目前为止我做了什么: 我有一个以下数据库架构:

var GameSchema = new Schema({
    title: {
        type: String,
        trim: true,
        required: 'Title cannot be blank',
        unique: 'Title must be unique'
    },
    invitedPlayers: [{
        email: {
            type: String
        },
        resources: {
            wood: {
                type: Number,
                default: 0
            },
            stone: {
                type: Number,
                default: 0
            },
            gold: {
                type: Number,
                default: 0
            }
        }
    }]
});
mongoose.model('Game', GameSchema);

我希望将新条目推送到invitePlayers。每当管理员填写带有用户邀请的表单并单击提交时,应用程序将使用此方法:

// Invite new User
$scope.invite = function() {
    // Create new Game object
    var game = new AdminGamesService ({
        _id: $stateParams.gameId,
        invitedPlayers: $scope.player,
    });

    game.$update(function() {
        $location.path('admin/users');
    }, function(errorResponse) {
        $scope.error = errorResponse.data.message;
    });
};

并在服务器上运行它(_ - 使用lodash):

// Update game
exports.update = function(req, res) {
    var game = req.game ;
    game = _.extend(game , req.body); //here should be something that merge arrays instead of replacing them?
    game.save(function(err) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(game);
        }
    });
};

但是这整个代码覆盖了我的早期邀请玩家,并且只添加了新的代码:(我必须改变一些东西来推送阵列邀请玩家,但我不知道是什么:)

1 个答案:

答案 0 :(得分:0)

问题是lodash _extend覆盖数组,所以我在更新函数中做了一些更改,现在它可以工作了:

exports.update = function(req, res) {
    var game = req.game;
    var invitedPlayers = game.invitedPlayers;
    if(req.body.invitedPlayers) invitedPlayers.push(req.body.invitedPlayers);
    game = _.extend(game , req.body);
    game.invitedPlayers = invitedPlayers;

    game.save(function(err) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(game);
        }
    });
};