我是否需要将objectid推送到mongodb中的两个模式?

时间:2015-10-06 09:57:47

标签: node.js mongodb mongoose

现在我真的很困惑,我是否需要将objectId推送到两个架构或者只是将它保存在一个架构中?

我的架构

var CourseSchema = Schema({
  title: String,    
  content: [{ type: Schema.Types.ObjectId, ref: 'Video'}],    
});

var VideoSchema = Schema({
    ownedBy: { type: Schema.Types.String, ref: 'Course'},
    name: String
});

架构目标

  • 课程可以有很多内容,参考是视频和视频 只能由一门课程拥有。

假设我要创建一个新的视频对象,然后将其ownedby字段存储到特定的课程对象

这是代码

app.get('/testData', function(req, res) {
   Course.findOne({ title: "Testing Course" }, function(err, course) {
       // Create a new video object
       var video = new Video();
       // store the object id into ownedby field, so that it belongs "Testing Course"
       video.ownedBy = course._id;
       video.title = newData.name;
       // save it
       video.save(function(err, vid) {
           // Is it necessarily for me to push each video object to a course's content field?
           course.content.push(vid._id);
        });   

    });

});

如果您阅读了评论,那么您就知道我面临的是什么,如果没有,请让我再解释一下

  1. FindOne一个与Course's系列相匹配的特定标题 是"测试课程"

  2. 制作新视频的对象,然后将其存储到视频中 ownedBy字段

  3. 保存课程的对象,然后将每个视频的ID推送到其中 内容。

  4. 没有错误或任何错误,但是将对象id同时推送到两个模式对我来说有点多余

    真正的问题是,我真的需要将对象ID推送到两个模式吗?

1 个答案:

答案 0 :(得分:1)

您必须使用引用更新这两个对象。这意味着您还需要使用video _id更新Course对象。目前您正在使用findOne(),它只返回文档,而不是更新文档。

以下是代码示例:

Course.findOne({ title: "Testing Course" }, function(err, course) {
       if (err) return handleError(err);

       var video = new Video();
       video.ownedBy = course._id;
       video.title = newData.name;

       video.save(function(err, vid) {
           if (err) return handleError(err);

           course.content.push(vid._id);

           course.save(function(err) {
                if (err) return handleError(err);
           });  
       });  

    });