如何在创建父文档时自动创建引用的子文档?

时间:2014-02-28 05:34:23

标签: mongoose

我有以下模型:

var GameSchema = new Schema({
    players: [{type: Schema.Types.ObjectId, ref: 'Player'}], 
});

var PlayerSchema = new Schema({
    name: {
        type: String,
        required: true
    }
});
mongoose.model('Player', PlayerSchema); 
mongoose.model('Game', GameSchema); 

这是我的代码:

var p1 = new Player({name: 'abc'});
var p2 = new Player({name: 'def'});
var agame = new Game({players:[p1,p2]});
agame.save();

我想要做的是在db中创建新游戏时,还应该创建p1,p2播放器。我的代码不起作用,p1,p2未保存。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

您需要手动执行此操作。首先保存玩家并获取他们的对象ID。推入引用的父播放器数组。 下一步是保存父。

答案 1 :(得分:2)

players是一个ObjectIds数组,因此您需要传入_id p1p2而不是整个对象。 _id期间会填充新模型的new字段,因此可以立即使用,但您仍然需要在所有三个字段上调用save

var p1 = new Player({name: 'abc'});
var p2 = new Player({name: 'def'});
var agame = new Game({players: [p1._id, p2._id]});
p1.save();
p2.save();
agame.save();

答案 2 :(得分:0)

在我的情况下,我也必须手动执行此操作。因为它是一个Web应用程序,所以在我的父控制器中它有类似

的东西
.post((req, res) => {
    let parent = req.body;
    if(parent && parent.childrenArray){
        let ids = [];
        parent.childrenArray.forEach((children)=>{
            let c = new Children(children);
            c.save();
            ids.push(c._id);
        })
        parent.childrenArray = ids;
        req.body = parent;
    }

    // create parent
})