node.js - Mongoose 不会将嵌套对象保存在另一个嵌套对象中

标签 node.js mongodb mongoose save nested

通常在mongoose中保存嵌套的对象,通过父亲的调用方法save,但是如果我们有两层约定,祖父,父亲[nested],儿子[nested],儿子是不会通过父亲的调用方法save来保存的.

祖父 -> 组

var schema = new mongoose.Schema({
   name: String,
   days:[mongoose.Schema.Types.Day],
});

module.exports = mongoose.model('Group', schema);

父亲 -> 日

var schema = new mongoose.Schema({
   _id: Number,
   matches:[mongoose.Schema.Types.Match]
});
module.exports = mongoose.model('Day', schema);

儿子 -> 匹配

var schema = new mongoose.Schema({
  team1: {
    type: Schema.ObjectId,
    ref:'Team'
  },
  team2: {
    type: Schema.ObjectId,
    ref: 'Team'
  },
  score: [Number]
});

module.exports = mongoose.model('Match', schema);

在路由(“matches.js”)中,我尝试保存组联合天和匹配。

Group.findById(groupId).exec(
        function(err, group){
        var match = new Match();
        var day = group.days[dayNumber-1];
        day.matches.push(
            match
        );
        group.save(function(err){
            console.log("success");
            console.log("group in matches.js:"+group);
            res.redirect("/tournaments/"+tournamentId+"/groups/"+groupId+"/days/"+dayNumber);
        });
     });

在重定向中,我再次打印“组”,匹配消失。

app.get('/tournaments/:tournamentId/groups/:groupId/days/:dayNumber', function (req, res) {
    groupId = req.params.groupId;
    dayNumber =  req.params.dayNumber;
    Group.findById(groupId, function (err, group) {
        console.log("group in days.js:"+group);
        res.render('days/show', {
            title: 'Days',
            group:  group,
            day:group.days[dayNumber-1],
            tournamentId: req.params.tournamentId
        });
    });
});

控制台日志打印:

new match
success
group in matches.js:{ __v: 7,
  _id: 53a3ee54dfe793bd9a20c6ab,
  name: 'gruppo sdirubbo',
  days: [ { matches: [Object], _id: 1 } ] }
GET /tournaments/539f0185ea17e46e73be937b/groups/53a3ee54dfe793bd9a20c6ab/days/1/newMatch 302 4ms - 208b
group in days.js:{ __v: 7,
  _id: 53a3ee54dfe793bd9a20c6ab,
  name: 'gruppo sdirubbo',
  days: [ { matches: [], _id: 1 } ] }

最佳答案

mongoose.Schema.Types.Daymongoose.Schema.Types.Match 未定义,因此引用它们的那些数组字段最终以 Mixed 类型,除非您明确标记它们已修改,否则它们不会保存。

您需要使这些模式在模型定义之间可用,然后在您的定义中使用它们。例如:

var matchSchema = new mongoose.Schema({
  team1: {
    type: Schema.ObjectId,
    ref:'Team'
  },
  team2: {
    type: Schema.ObjectId,
    ref: 'Team'
  },
  score: [Number]
});

var daySchema = new mongoose.Schema({
   _id: Number,
   matches:[matchSchema]
});

var groupSchema = new mongoose.Schema({
   name: String,
   days:[daySchema],
});

关于node.js - Mongoose 不会将嵌套对象保存在另一个嵌套对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328057/

相关文章:

node.js - 如何处理 Mongoose 文档版本错误

javascript - 将 promise 的 future 值保存在变量中

node.js - Mongoose 填充在 2 个数据库中

javascript - 如何从 findOneAndUpdate 方法中获取更新的文档?

mongodb - 如何检查对象嵌套属性是否存在?

arrays - 具有 2 个(或更多)模式类型的 mongoose 数组

javascript - 给定文件描述符,如何打开 nodejs 双工流?

javascript - 如何从流中获取数据?

json - 访问 webhook URL 时出现错误 "Action Error: no matching intent handler for: null"

javascript - 如何在静态 Javascript 中嵌入 EJS 代码?