2017-02-16 10 views
0

特定のMongoose Subdocument SchemaでObject.assign(例:Object.assign({foo:bar1}、{foo:bar2})を使用すると、foo: BAR2のobjがfooの上書きしません:。BAR1のOBJをObject.assign()Mongoose SubDocument Schemaに関する問題

を私のアプリでは私は2つのサブ文書スキーマでアカウントのスキーマを持って、&プロパティを投写することが、私は問題が発生したプロジェクトのサブ文書スキーマにあります

。ここ

は私のモデルです:ここでは

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

だから、それは私に問題を与えているPUTメソッドだ、私は、ポストを取得問題なく削除しますが、私はこのObject.assign問題が発生した場所のプロジェクトのために入れ部分があることができます。面白いのは、Property Schema Put Methodのすべてが完璧に機能し、基本的にProject 1と全く同じことです。私はプロジェクトのputメソッドで値の一部をCONSOLE.LOG場合

私は次の取得:私は更新され、元の値を記録するとき

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メソッド呼び出しの結果であるオブジェクトに代入しようとしています。関数によって返されるドキュメントのコピーにのみ影響し、元のサブ文書の配列には影響しません。

私はマングースに新しいですが、私はあなたがMongooseArrayと同様account.projectsで動作するようにしようと提案します:

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} –