使用 Mongoose 更新子数组对象不起作用

Posted

技术标签:

【中文标题】使用 Mongoose 更新子数组对象不起作用【英文标题】:Updating subarray object with Mongoose not working 【发布时间】:2016-05-04 23:11:10 【问题描述】:

我的 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 对象中,并且数据库中的项目没有更新。我也没有收到任何错误。

在我执行 item = req.body; 的那一刻,我检查了 req.body 和 item 都具有完全相同的字段。

另一方面,如果我这样做 item.name='whatever' ,它会起作用。

我已经与这个问题斗争了 4 个小时,但没有解决方案......

我也尝试过 Mongoose 的 findOneAndUpdate() 查询,但没有成功。

【问题讨论】:

【参考方案1】:

如果您将item 分配给一个新值,您实际上并没有更改数组的内容。 item 只是对数组中元素的引用。

您可能想要通过合并两个对象itemreq.body 来编辑数组的内容。

require('extend'); // npm install extend
extend(item, req.body);

这实际上会更新数组中的值,然后将其保存。

但是,我建议使用 mongoose 更新子文档,如下所述:Mongoose find/update subdocument

【讨论】:

您的解决方案奏效了!另一方面,我尝试了您上次推荐的解决方案,但没有奏效。

以上是关于使用 Mongoose 更新子数组对象不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:通过 findOneAndUpdate 查询使用嵌套对象数组的总和更新父子数据属性不起作用

更新对象数组中的元素在 Mongoose 中不起作用

当嵌入式数组对象更改时,Mongoose 实例 .save() 不起作用

更新 mongoose json 对象似乎不起作用

使用 mongoose 5.12 从数组中删除对象($pull 不起作用)

比较 Mongoose 对象 ID 时,if 语句在 Jade 中不起作用