Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 正在尝试更新Express中的嵌套/子文档_Node.js_Express_Mongoose - Fatal编程技术网

Node.js 正在尝试更新Express中的嵌套/子文档

Node.js 正在尝试更新Express中的嵌套/子文档,node.js,express,mongoose,Node.js,Express,Mongoose,我有一个Mongoose模型,它有嵌套数组和一个子文档 在发布到对象数组/子文档时,我似乎还可以,但在.put方面遇到了问题 我对参数进行了硬编码以备测试,以防出于某种原因它们不是从邮递员那里来的 我从上面的代码得到的结果是一个空数组 所以我得到了正确的记录,它创建了电话阵列,但没有填充 .put(function(req, res){ Member.find({'_id':req.params.id}, function(err, member){ if(err) re

我有一个Mongoose模型,它有嵌套数组和一个子文档

在发布到对象数组/子文档时,我似乎还可以,但在.put方面遇到了问题

我对参数进行了硬编码以备测试,以防出于某种原因它们不是从邮递员那里来的

我从上面的代码得到的结果是一个空数组

所以我得到了正确的记录,它创建了电话阵列,但没有填充

.put(function(req, res){
  Member.find({'_id':req.params.id}, function(err, member){
    if(err)
      res.send(err);

      member.phone.push({
        number: "78787878787",
        phoneType: 2
      })


    member.save(function(err){
      if(err)
        res.send(err);
      res.json(member);
    });
  });
});
我想有一个端点,只需添加另一个电话记录

这是我的模型:

//DEPENDENCIES
var mongoose = require('mongoose');


var contactSchema = new mongoose.Schema({
  name:{type:String},
  age:{type:Number}
});

var phoneSchema = new mongoose.Schema({
  number:{ type: String },
  phoneType:{ type: Number }
})

var memberSchema = new mongoose.Schema({

  firstname: {
    type: String
  },
  lastname: {
    type: String
  },
  phone:[phoneSchema],
  contacts:[contactSchema]

  });

//RETURN MODEL

module.exports = mongoose.model('member', memberSchema);
现在,当我运行代码时,我得到了以下未定义的成员:

{ id: '587bcbffe64e9f28a6894dd7' }
[ { _id: 587bcbffe64e9f28a6894dd7,
    lastname: 'Stanley',
    firstname: 'Dave',
    __v: 0,
    contacts: [ [Object] ],
    phone: [] } ]
events.js:154
      throw er; // Unhandled 'error' event
      ^

TypeError: Cannot read property 'push' of undefined
find返回一个文档数组,而不仅仅是一个文档。这就是为什么当您尝试执行member.phone时会出现错误

使用findOne而不是find,因为您通过_id进行查询,它将只返回一个匹配的文档,如果不存在,则返回null,因此它是比find更好的选择

另外,最好检查结果是否为null。如果不存在此类id,则成员将为空

Member.findOne({'_id':req.params.id}, function(err, member){
    if(err)
      res.send(err);
    else if(member!=null)
    {
        member.phone.push({
            number: "78787878787",
            phoneType: 2
        });
        member.save(function(err){...});
    }
});
如果您热衷于使用find。使用成员[0]作为第一个元素,而不是成员


希望对您有所帮助。

您想在手机阵列中放置两个对象吗?一个有数字,另一个有电话类型?嗨,拉维,事实上没有。只有一个有两个值的对象。我会解决的。你有没有想过为什么不把值保存到手机上?你能做一下console.logreq.params并告诉我结果是什么吗?嗨,拉维,看看我的更改。我确实发现我的路线有问题,现在我已经改变了。至于更新,由于某种原因,当我尝试使用member.phone.Done推送新的电话联系人时,我收到一条消息,表示我的成员对象未定义。如果您有时间,我会发布一篇后续文章,帮助您理解删除子文档项的过程:。是的。谢谢你,拉维!如果有人在帮助你,你应该通过投票来感谢他,兄弟。这使他们有动力帮助他人,并给Hi Ravi提供其他答案。我检查了你的答案。我错过什么了吗?还有一步要向上投票吗?不,我是说向上投票,就这样。正确的检查是对正确答案的标记,向上投票是两件不同的事情。但是很好。很高兴我能帮你解决你的问题。我也在回答你的另一个问题,但我写的时候,你已经解决了。但是对于这个问题,我有一个建议给你。您应该使用findOneAndUpdate而不是find,然后再次删除和保存。这样可以节省处理另一个回调的时间。
Member.find({'_id':req.params.id}, function(err, member){
    if(err)
      res.send(err);
    else if(member.length!=0)
    {
        member[0].phone.push({
            number: "78787878787",
            phoneType: 2
        });

        member[0].save(function(err){...});
    }
});