【问题标题】:Trying to update nested / subdocument in Express尝试在 Express 中更新嵌套/子文档
【发布时间】:2017-01-16 15:13:11
【问题描述】:

我有一个包含嵌套数组和子文档的 Mongoose 模型。

发布到对象数组/子文档时我似乎没问题,但我在使用 .put 时遇到了问题

我硬编码了用于测试的参数,以防万一它们由于某种原因没有从 PostMan 进来。

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

所以我得到了正确的记录,它创建了“电话”数组,但没有填充。

.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

【问题讨论】:

  • 你想要 2 个对象在电话阵列中吗?一个有号码,另一个有phoneType?
  • 嗨,拉维,实际上没有。只是一个具有两个值的对象。我会解决的。
  • 对为什么不将值保存到手机有什么想法吗?
  • 你可以console.log(req.params) 告诉我结果如何?
  • 嗨 Ravi,看看我的更改。我确实发现我的路线有问题,我现在已经改变了。至于更新,由于某种原因,当我尝试使用“member.phone”推送新的电话联系人时,我收到一条消息,指出我的“会员”对象未定义。

标签: node.js express mongoose


【解决方案1】:

find 返回一个文档数组,而不仅仅是一个文档。这就是为什么当您尝试执行 member.phone 时它会出错。

使用findOne 而不是find,因为_id 使用querying,它将return 仅匹配一个文档或null(如果它不存在),所以它比@ 更好的选择987654330@.

另外,最好检查result 是否为null。如果不存在这样的_idmember 将是 null

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。使用member[0](第一个元素)而不是member

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){...});
    }
});

希望对你有所帮助。

【讨论】:

  • 完成。如果您有时间,我发布了一个后续内容以帮助我了解删除子文档项:stackoverflow.com/questions/41682734/…
  • 是的。谢谢,拉维!
  • 如果有人在帮助你,你应该通过投票来感谢兄弟的回答。这使他们有动力帮助他人并给出其他答案
  • 嗨拉维。我检查了你的答案。我错过了什么吗?是否还有其他步骤可以投票?
  • 不,我的意思是投票,就是这样。正确的检查是标记正确答案和赞成是两个不同的事情。但它很好。很高兴我能帮你解决你的问题。我也在给你其他问题的答案,但是我写它的时候,你已经解决了。但对于这个问题,我有一个建议给你。您应该使用findOneAndUpdate 而不是find,然后再次删除并保存。这样可以省去处理另一个回调的麻烦。
猜你喜欢
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2018-04-07
  • 2017-10-20
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多