2017-01-23 4 views
0

У меня есть приложение, в котором я пытаюсь добавить записи контактов в документ пользователя «Профиль», где каждая запись имеет массивы/поддокументы для нескольких номеров телефонов и адресов электронной почты.Обновление вспомогательных документов не работает

Так Профиль Схема выглядит следующим образом:

var ContactSchema = require('./contact'); 
var UserSchema = new Schema({ 

    first_name:{ 
     type: String 
    }, 
    last_name:{ 
     type: String 
    }, 
    contacts:[ContactSchema] 
}); 

ContactSchema выглядит следующим образом:

var ContactSchema = new Schema({ 

    contact_name:{ 
     type: String 
    }, 
    contact_age:{ 
     type: String 
    }, 
    phones:[{ 
     phone_number:{type: String}, 
     phone_type:{type: String} 
    }], 
    emails:[{ 
     email_address:{type: String}, 
     email_type:{type: String} 
    }] 
}); 

Я упрощена вышеприведенные схемы, но они по существу представляют собой структуру, что я имею дело с.

Моя задача заключается в API ExpressJs/Mongoose, где я хочу передать объект и обновить поддокументы.

Вот как я думал, что это будет сделано, но это не работает:

var express = require('express'); 
var router = express.Router(); 
var Profile = require('../models/profile'); 
var vCard = require('vcards-js'); 

router.route('/addcontact/:ownerId') 

.put(function(req, res){ 

    Profile.findOne({'owner_id':req.params.ownerId}, function(err, profile){ 

    if(err) 
     res.send(err); 

    profile.contacts.push({ 
     first_name : req.body.first_name, 
     last_name : req.body.last_name 
    }) 

    req.body.phones.forEach(function(phone, index, arr){ 
     profile.contacts.phones.push({ 
     phone_type:phone.phone_type, 
     phone_number:phone.phone_number 
     }) 
    }) 

    req.body.emails.forEach(function(email, index, arr){ 
     profile.contacts.emails.push({ 
     email_type:email.email_type, 
     email_address:email.email_address 
     }) 
    }) 

    profile.save(function(err){ 
     if(err) 
     res.send(err); 
     res.json(profile); 
    }) 

    }); 
}); 


module.exports = router; 

Так уточнить, у меня есть существующий «Профиль пользователя» запись. Пользовательская схема имеет массив «контактов» для хранения нескольких контактов. Каждый контакт имеет телефонные и электронные почтовые ящики, поэтому каждая запись контактов может содержать несколько электронных писем и телефонных номеров.

То, что я пытаюсь сделать, это .PUT записи контактов и обновление документа профиля пользователя.

Спасибо за любой совет мудреца !!

ответ

1

Ваш User модель, кажется, не имеют owner_id. Предполагая, что он пропущен здесь, и вы хотели добавить новый контакт с существующим пользователем.

'use strict'; 

var express = require('express'); 
var router = express.Router(); 
var Profile = require('../models/profile'); 

router.route('/addcontact/:ownerId').put(function (req, res) { 
    var phones = req.body.phones; 
    console.log('phones', phones); 

    var emails = req.body.emails; 
    console.log('emails', emails); 

    var contacts = { 
    contact_name: req.body.first_name, 
    contact_age: '25', 
    emails: emails, 
    phones: phones 
    }; 

    Profile.findOneAndUpdate({ 
    owner_id: req.params.ownerId 
    }, { 
    $push: { 
     contacts: contacts 
    } 
    }, { 
    new: true 
    }, (err, profile) => { 
    if (err) { 
     return res.send(err); 
    } 
    return res.json(profile); 
    }); 

}); 


module.exports = router; 

И одно незначительное изменение, которое я сделал свой код добавляет return при отправке ответа, чтобы избежать дальнейшего выполнения кода.

0
var phonesArray = req.body.phones; 
var emailsArray = req.body.emails; 

Profile.findOneAndUpdate(
{'owner_id':req.params.ownerId} 
{phones: {$push: {$each: phonesArray}}, emails: {$push: {$each: emailsArray }}}, function(err, profile){ 
    if(err) 
     res.send(err); 

    console.log(profile); 
} 
+0

Привет, Джексон, попробовал ваш код, но я просто пустые массивы. Я что-то упускаю? Я могу console.log и видеть, что массивы передаются ... – cnak2

+0

Пустые массивы - телефоныArray и emailsArray? или в db после обновления? – Jackson

+0

PLS напишите свой код, с console.log и результаты журнала здесь. – Jackson

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