2017-02-16 98 views
0

所以,當我使用Object.assign,(前Object.assign({FOO:BAR1},{FOO:BAR2})在一個特定的貓鼬子文檔架構,foo的: BAR2 OBJ不會覆蓋FOO:BAR1 OBJObject.assign()的貓鼬子文檔架構問題

在我的應用我有兩個子文檔架構的帳戶架構,項目&屬性它是在項目的子文檔模式,我遇到的問題

這裏是我的模型:

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

var ProjectSchema = new Schema({ 
    _id: String, 
    name: String, 
}, { strict: false }) 

var PropertySchema = new Schema({ 
    _id: String, 
    slug: String, 
    name: String, 
    type: String, 
    placeholder: String, 
    order: Number 
}, { strict: false }) 

var AccountSchema = new Schema({ 
    _id: String, 
    name: String, 
    slug: String, 
    email: String, 
    properties: [PropertySchema], 
    projects: [ProjectSchema], 
}, { strict: false }) 

module.exports = mongoose.model('Account', AccountSchema); 

這裏是我的Middlew的片段是(我認爲這就是所謂的,如果我錯了,請糾正我)。這是我做Object.assign來覆蓋特定項目的屬性的地方。如果有幫助,我可以發佈所有路線。

router.route('/accounts/:account_id/projects/:project_id') 

    .get(function(req, res) { 
    Project.findById(req.params.project_id, function(err, project){ 
     if (err) 
     res.send(err); 
     res.json(project); 
    }); 
    }) 

    .delete(function(req, res){ 
    Account.findById(req.params.account_id, function(err,account){ 
     if (err) 
     res.send(err); 

     account.projects.id(req.params.project_id).remove(); 

     account.save(function(err) { 
     if(err) 
      res.send(err); 
     res.json({message: 'Project Deleted'}); 
     }); 
    }) 
    }) 

    .put(function(req, res){ 
    Account.findById(req.params.account_id, function(err,account){ 
     if (err) 
     res.send(err); 

     Object.assign(account.projects.id(req.params.project_id), req.body); 

     account.save(function(err) { 
     if(err) 
      res.send(err); 
     res.json({message: 'Project Updated'}); 
     }); 
    }) 
    }); 

// ---------------------------------------------------- 
router.route('/accounts/:account_id/properties/:property_id') 

    .get(function(req, res) { 
    Property.findById(req.params.property_id, function(err, property){ 
     if(err) 
     res.send(err); 
     res.json(property); 
    }); 
    }) 

    .delete(function(req, res){ 
    Account.findById(req.params.account_id, function(err, account){ 
     if (err) 
     res.send(err); 
     account.properties.id(req.params.property_id).remove(); 
     account.save(function(err){ 
     if(err) 
      res.send(err); 
     res.json({ message: 'Successfully Deleted' }); 
     }) 
    }) 
    }) 

    .put(function(req, res){ 
    Account.findById(req.params.account_id, function(err, account) { 
     if (err) 
     res.send(err); 

     Object.assign(account.properties.id(req.params.property_id), req.body); 

     account.save(function(err) { 
     if(err) 
      res.send(err); 
     res.json({message: 'Property Updated'}); 
     }) 
    }) 
    }); 

所以這是給我的問題,我可以GET,POST,沒有問題刪除put方法,但對項目的認沽部分是我遇到這個問題Object.assign。有趣的是,一切都完美適用於Property Schema Put Method,它基本上與Project 1完全相同。

如果我CONSOLE.LOG一些值在項目的put方法,我得到以下幾點:

console.log(account.projects.id(req.params.project_id)); 
//original value logs { _id: '1486609836741', foo: 'bar' } 
console.log(req.body); 
//updated value logs { foo: 'barred', _id: '1486609836741' } 

console.log(Object.assign(account.projects.id(req.params.project_id), req.body)); 
//logs the original value { _id: '1486609836741', foo: 'bar' } 

所以,當我登錄的更新,原始值它們具有相同的密鑰,不應對象。分配工作?原始的Obj是否比console.log顯示的更復雜,並且原始的和更新的可能沒有相同的密鑰?

我有點難住,任何幫助將不勝感激。讓我知道是否需要發佈更多我的代碼。謝謝。

回答

0
Object.assign(account.projects.id(req.params.project_id), req.body); 

在這裏,你想分配給一個對象,它是在account.projects陣列MongooseDocumentArray.id方法調用的結果。這隻會影響函數返回的文檔的副本,並且不會影響原始數組的子文檔。

我是新來的貓鼬,但我會建議你嘗試與account.projects與MongooseArray工作:

var project = account.projects.id(req.params.project_id), 
    index = account.projects.indexOf(project); 

Object.assign(account.projects[ index ], req.body); 
+0

我得到更新的對象的同一問題不分配給原account.project {} targetproject –