我的MongoDB数据库主文档如下所示:
{
"_id": {
"$oid": "568ad3db59b494d4284ac191"
},
"name": "Myclass",
"items": [
{
"name": "Conductive Gel",
"internal_id": "ID00067",
"description": "ECG Conductive Gel",
"short_description": "ECG Conduct. Gel",
"providers": [
{
"name": "one",
"address": ""
},
{
"name": "two",
"address": ""
}
]
},
{
}
]
}
好的是我收到的ajax put调用应该更新其中一个项目(与_id匹配的项目)。
我的方法:
exports.updateItem = function(req, res, next) {
classes.findOne({_id: '568ad3db59b494d4284ac19d'}, function(e,myclass){
if(!e) {
myclass.items.forEach(function(item){
if (item._id == req.body._id) {
item = req.body;
myclass.save(function(err, doc){
if (err) return next(err);
return res.status(200).send('The item has been updated!');
});
}
});
} else {
res.status(500).send('Class not folund in BBDD!!');
}
});
};
当我执行item = req.body;
时,req.body信息未映射到项目mongoose对象,并且数据库中的项目未更新。我也没有收到任何错误。
我已经检查过req.body和item在我item = req.body;
的那一刻都有完全相同的字段。
如果我做item.name='whatever'
,另一方面,它可以工作。
我现在已经用这个问题奋斗了4个小时而没有解决方案......
我也尝试过Mongoose的findOneAndUpdate()查询但没有成功。
答案 0 :(得分:1)
如果将item
分配给新值,则实际上并未更改数组的内容。 item
只是对数组中元素的引用。
您可能想要的是通过合并两个对象item
和req.body
来编辑数组的内容。
require('extend'); // npm install extend
extend(item, req.body);
这将实际更新数组中的值,然后保存。
但是,我建议使用mongoose更新子文档,如下所述:Mongoose find/update subdocument