2016-02-26 50 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

很高興我能夠幫助! –