更新需要在mongoose中填充的父对象的子对象属性

时间:2014-03-28 16:52:12

标签: javascript node.js mongodb mongoose

我是Mongoose的新手,我很难在模型中更深入地访问属性并更新以下模型结构的属性。

游戏架构

var gameSchema = new Schema({
    opponents: [{
        type: Schema.Types.ObjectId,
        ref: 'teams'
    }],
    startTime: { type: Date, default: Date.now },
    endTime: Date,
    pauses: [{
        start: Date,
        end: Date
    }],
    winner: {
        type: Schema.Types.ObjectId,
        ref: 'teams'
    },
    status: {type: String, default: "created"},
    score: [{
         "opponent1": {type: Number, default: 0},
         "opponent2": {type: Number, default: 0}
    }],

}, { versionKey: false });

团队架构

var teamSchema = new Schema({
    name:String,
    badge:String,
    goals:[{type: Date, default: Date.now}],
    totalWins:Number
}, { versionKey: false });

我的问题是我正试图通过特定游戏向团队添加目标。

所以我的终点:

POST: / api / game / GAME_ID / goal

DATA: {_ id:TEAMID}

我认为以下内容可行:

Games.findById(GAME_ID)
        .populate('opponents')
        .find({'opponent._id': TEAM_ID})
        .exec(function(err, team) {
            // Team from game with matching ID returned
            // Now push goal time into array
            team.goal.push(Date.now());
        });

以上似乎没有回归团队。如果我删除第二个发现游戏被退回然后我必须做一些可怕的事情:

Games.findById(GAME_ID)
    .populate('opponents')
    .exec(function(err, game) {
         if(game.opponents[0]._id.toString() === req.body._id) {
             game.opponents[0].goals.push(Date.now());
         } else if (game.opponents[1]._id.toString() === req.body._id) {
             game.opponents[1].goals.push(Date.now());
         } else {
             // Throw error no matching team with id
         }
     });

game.save(function(err, game) {
    //Game saved
});

这最后一个例子似乎有效,但是当我尝试添加进一步的目标进入目标数组时,它会覆盖旧目标时间。

所以回顾一下。

  • 如何查询游戏模型以通过id检索子项 尚未填充?
  • 如何将目标时间戳设置为目标数组而不用 覆盖前一个?

是否可以比上面给出的当前示例更优雅地做这些。

1 个答案:

答案 0 :(得分:0)

Games.findById(GAME_ID)
    .populate(
        path: 'opponents',
        match: { _id: TEAM_ID}
    )
    .exec(function(err, team) {
        // Team from game with matching ID returned
    });