Node.js 正在尝试更新Express中的嵌套/子文档
我有一个Mongoose模型,它有嵌套数组和一个子文档 在发布到对象数组/子文档时,我似乎还可以,但在.put方面遇到了问题 我对参数进行了硬编码以备测试,以防出于某种原因它们不是从邮递员那里来的 我从上面的代码得到的结果是一个空数组 所以我得到了正确的记录,它创建了电话阵列,但没有填充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
.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){...});
}
});