2017-02-16 3 views
0

Итак, когда я использую Object.assign (например, Object.assign ({foo: bar1}, {foo: bar2}) на конкретной схеме субдокумента Mongoose, foo: bar2 OBJ не будет перезаписывать Foo:. планкой1 OBJObject.assign() Проблемы на схеме SubDocument Mongoose

в моем приложении у меня есть схемы счета с двумя схемами поддокументу, Проекты & Свойства Это в схеме суб документа проекта, что я сталкиваюсь вопрос

..

Вот мои модели:

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 метод, который дает мне вопрос, я могу получить, сообщение, удалить без каких-либо проблем, но Put часть для проектов, где я встречаю этот Object.assign вопрос. Смешно, что все отлично работает для метода Put Schema Method, и в основном это то же самое, что и Project Project.

Если я 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); 

Здесь вы пытаетесь присвоить объект, который является результатом MongooseDocumentArray.id вызова метода account.projects массива. Это повлияет только на копию документа, возвращаемого функцией, и не повлияет на исходный массив поддокументов.

Я новичок в Mongoose, но я предлагаю вам пытаться работать с 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} –

Смежные вопросы