2016-02-26 49 views
0

我是Mongoose和Nodejs开发的新手,我对如何正确设置保存我的记录有点困惑。这里是我的两个模式:Mongoose为人口储蓄

下载

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 

var downloadSchema = Schema({ 
    title  : String, 
    description : String, 
    _project  : { type: Schema.Types.ObjectId, ref: 'Project' } 
}); 

module.exports = mongoose.model('Download', downloadSchema); 

项目

... 

var projectSchema = Schema({ 
    name   : String, 
    url   : String, 
    pwd   : String, 
    _downloads : [{type: Schema.Types.ObjectId, ref: 'Download' }] 
}); 

module.exports = mongoose.model('Project', projectSchema); 

这似乎是正常工作。该文档解释了我保存下载和链接项目的用例,但我不确定如何正确填充Project._downloads。下面是我做了什么:

快速路由处理:

function createDownload(req, res) { 

    // the Project Id is passed in the req.body as ._project 
    var dldata = req.body; 

    Project.findOne({ _id : dldata._project }, function(err, project) { 
     var dload = new Download(dldata); 


     dload.save(function (err, download) { 

      project._downloads.push(download._id); 
      project.save(function(err){ 
       var msg = {}; 
       if(err) { 
        msg.status = 'error'; 
        msg.text = err; 
       }else { 
        msg.status = 'success'; 
        msg.text = 'Download created successfully!'; 
       } 

       res.json(msg); 
      }); 

     }); 
    }); 
} 

这似乎过于复杂了我。我应该手动push._downloads数组,还是Mongoose应该基于模式内部处理?有没有更好的方式来实现它,这样我可以这样做:

Download.find().populate('_project').exec(... 

还有:

Project.findOne({_id : _projectId}).populate('_downloads').exec(... 

回答

1

按照有2种方式来SUBDOCS添加到父对象:

1)通过使用create()方法

使用push()方法

2)

所以我认为你的代码可以是一个有点通过消除存储一个新的下载项目的操作简化:

function createDownload(req, res) { 
    var dldata = req.body; 

    Project.findOne({ _id : dldata._project }, function(err, project) { 
     // handle error 

     project._downloads.push(dldata); 

     project.save(function(err) { 
      // handle the result 
     }); 
    }); 
} 

function createDownload(req, res) { 
    var dldata = req.body; 

    Project.findOne({ _id : dldata._project }, function(err, project) { 
     // handle error 

     project._downloads.create(dldata); 

     project.save(function(err) { 
      // handle the result 
     }); 
    }); 
} 
+0

谢谢!一旦我将'._downloads'的Project模式修改为:'_downloads:[Download.schema]'它就像一个魅力一样工作。我甚至不知道要看subdocs,所以谢谢你指出我正确的方向。 –

+0

很高兴我能够帮助! –