如何用MEAN / MongoDB实现级联插入?

时间:2015-03-12 19:42:47

标签: mongodb express mongoose mean-stack meanjs

我试图在Mongoose / MongoDB中为具有1对多关系的对象实现级联插入,并努力实现它。在这种情况下,大学与部门有一对多的关系。这是我的大学对象。



var UniversitySchema = new Schema({
  name: {
    type: String,
    default: '',
    trim: true
  },
  departments: [{
    type: Schema.ObjectId,
    ref: 'Department'
  }]
});

mongoose.model('University', UniversitySchema);




这是我的部门架构:



var DepartmentSchema = new Schema({
  name: {
    type: String,
    default: '',
    trim: true
  },
  University: {
    type: Schema.ObjectId,
    ref: 'University'
  }]
});

mongoose.model('Department', DepartmentSchema);




这是我尝试在模式中放入帖子的内容。基本上,当我保存一个部门时,我试图在大学中插入部门ID以在两个方向上建立一对多的关系。当然,我也在创建部门时节省大学ID - 这很容易。



DepartmentSchema.post('save', function(next) {
    var university = University.find({_id: this.university._id});
    if(!university.departments) {
    	university.departments = [];	
    }
   	university.departments.push(new ObjectId(this._id));
    university.save().exec();
    next();
});




这会在此行上出错,说它无法识别大学对象的保存方法。



university.save().exec();




我也尝试在模型服务器控制器中执行此操作,但这看起来并不正确,因为大多数方法都被REST请求包装。当然,我可以通过发出多个请求从客户端处理这个问题,但我想有一种方法可以在服务器端执行此操作。由于这是数据层内部的,在我看来,我应该能够使用mongo中间件处理这个问题。

2 个答案:

答案 0 :(得分:2)

查询的结果传递给回调,而不是返回。

var university = University.findOne({_id: this.university._id});

变量university现在是查询对象,而不是查询的结果。这就是你得到TypeError: Object# < Query > has no method 'save'的原因。查询的结果将传递给查询的回调函数:

University.findOne({_id: this.university._id}, function(err, university){

    // here is your result
});

同样,您需要将最终回调传递给您的保存:

university.save(next)

答案 1 :(得分:1)

save方法必须具有回调函数参数,请尝试:

university.save(function (err) {
  if (err) return handleError(err);
  // saved!
})