更新子子文档不起作用

时间:2017-01-23 17:15:06

标签: node.js express mongoose mongoose-schema

我有一个应用程序,我正在尝试将联系人记录添加到用户"个人资料" document,其中每条记录都有多个电话号码和电子邮件地址的数组/子文档。

所以Profile Schema看起来像这样:

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

我简化了上面的模式,但它们基本上代表了我所处理的结构。

我的挑战是在ExpressJs / Mongoose API中,我想传递对象并更新子文档。

以下是我认为它会如何完成,但这不起作用:

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联系记录并更新用户档案文档。

感谢任何圣人的建议!!

2 个答案:

答案 0 :(得分: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以避免进一步执行代码。

答案 1 :(得分: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);
}