【问题标题】:How to implement cascade insert with MEAN/MongoDB?如何使用 MEAN/MongoDB 实现级联插入?
【发布时间】:2015-05-15 03:31:05
【问题描述】:

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

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);

这是我尝试在架构中放入 post 的内容。基本上,当我保存一个部门时,我试图在大学中插入部门 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 中间件来处理这个问题。

【问题讨论】:

    标签: mongodb express mongoose mean-stack meanjs


    【解决方案1】:

    保存方法必须有回调函数参数,试试这个:

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

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 现在我已经放入了回调并且也使用回调进行保存,但是我仍然在 university.save DepartmentSchema.post('save', function(next) { University.find({ _id: this.university._id }, function(err, university) { if (!university.departments) { university.departments = []; } university.departments.push(new ObjectId(this._id)); university.save(function(err) { if (err) return console.log('err-->' + err); // saved! }); }); }); ` university.save(function(err) { ^ TypeError: Object has no方法“保存”`
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多