2016-01-27 89 views
0

我的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信息沒有被映射到項目貓鼬對象,並在數據庫中的項目不會被更新。我也沒有得到任何錯誤。

我已經檢查過req.body和item兩者在我做item = req.body;時有完全相同的字段。

如果我做item.name='whatever',另一方面,它的工作原理。

我一直在這個問題現在4小時戰鬥沒辦法解決......

我也試過貓鼬的findOneAndUpdate()查詢沒有成功..

回答

1

如果分配item到一個新的值實際上並沒有改變數組的內容。 item只是對數組中元素的引用。

您可能想要的是通過合併兩個對象itemreq.body來編輯數組的內容。

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

這將實際更新數組中的值,然後將被保存。

不過,我建議使用貓鼬按如下說明更新子文檔:Mongoose find/update subdocument

+0

您的解決方案的工作!另一方面,我在你最後的建議中嘗試瞭解決方案,但沒有奏效。 – Egidi