2017-02-16 3 views
0

Also, wenn ich Object.assign, (z. B. Object.assign ({foo: bar1}, {foo: bar2}) auf einem bestimmten Mongoose Subdocument Schema, das foo: bar2 obj die foo nicht überschreiben. bar1 objObject.assign() Probleme auf Mongoose SubDocument Schema

in meinem app ich habe ein Konto Schema mit zwei Unter Dokument Schemata, Projekte & Eigenschaften Es ist im Projektunter Dokument-Schema, das ich das Problem auftreten

..

Hier sind meine Models:

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

Hier ist ein Ausschnitt meiner Middlew sind (Ich denke, das ist, wie es heißt, bitte korrigieren Sie mich, wenn ich falsch liege). Hier mache ich die Object.assign, um die Eigenschaften der einzelnen Projekte zu überschreiben. Wenn es hilft, kann ich alle Routen posten.

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

So ist es die PUT-Methode, die mir bei dem das Problem geben, kann ich mir, Post, ohne Probleme löschen, aber der Put Teil für Projekte, wo ich dieses Object.assign Problem auftreten. Lustig ist, dass alles perfekt für die Property-Schema-Put-Methode funktioniert, und es ist im Grunde genau dasselbe wie das Projekt.

Wenn ich einige der Werte in der Put-Methode Project console.log bekomme ich folgendes:

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

Also, wenn ich die aktualisierten und ursprünglichen Werte log sie gleiche Schlüssel haben, sollten nicht das Objekt. Arbeit zuweisen? Ist das ursprüngliche Obj komplexer als das, was die console.log anzeigt, und haben das Original und das Update möglicherweise nicht die gleichen Schlüssel?

Ich bin ein bisschen ratlos, jede Hilfe würde sehr geschätzt werden. Lass mich wissen, ob ich mehr Code schreiben muss. Vielen Dank.

Antwort

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

Hier Sie versuchen, zu einem Objekt zugewiesen werden, die auf account.projects Array Ergebnis MongooseDocumentArray.id Methodenaufruf ist. Dies betrifft nur eine Kopie des Dokuments, das von der Funktion zurückgegeben wird, und wirkt sich nicht auf das ursprüngliche Filialdokument aus.

Ich bin neu in Mungo, aber ich werde vorschlagen, dass Sie mit account.projects wie mit MongooseArray zu arbeiten versuchen:

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

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

Ich habe das gleiche Problem des aktualisierten Objekts nicht auf den ursprünglichen account.project Zuordnung . {Zielprojekt} –