2015-10-25 98 views
0

我正在通過使用郵遞員嘗試使用文件名更新數組來測試API。 當我用mongo查詢它時,該數組是空的。 ,其具有的圖像陣列的用戶模型:節點API更新不起作用

var UserSchema = new Schema({ 
    name: String, 
    email: { type: String, required: true, validate: [validate.email, 'invalid email address'], 
    index: { unique: true }}, 
    password: { type: String, required: true, select: false }, 
    images: [{ name: String }] 
}); 

的apiRouter快遞路由器:

apiRouter.put('/images/:user_id/:file_name', function(req, res){ 

     User.findById(req.params.user_id, function(err, user) {  
       //console.log(req.params.user_id); 
       //console.log(req.params.file_name); 
       user_id = req.params.user_id; 
       file_name = req.params.file_name; 

       user.update({$addToSet:{'images': file_name}}); 

       user.save(function(err) { 
        if (err) return res.send(err); 
         res.json({ message: 'User updated!' }); 
       }); 
     }); 
    }); 

郵差:

PUT http://localhost:3000/api/images/5626fd2903c49d6231518c9/imageA 

和MONGO db.find():

"images" : [ ] 

file_name ho lds正確的「imageA」值,但您可以看到圖像數組爲空。

+0

你的意思是說圖像名稱沒有插入mongodb的權利? –

回答

0

你這樣做都是錯誤的。像$addToSet這樣的運算符的更新意味着是原子的,這意味着它們直接在數據庫上進行更改,然後使用它完成。

因此呼籲像.update()需要的文件(S)匹配兩種查詢組件和一個「更新」組件修改匹配的文件(S):

apiRouter.put('/images/:user_id/:file_name', function(req, res) { 

    User.update(
     { "_id": req.params.user_id }, 
     { "$addToSet": {"images": req.params.file_name } }, 
     function(err,numAffected) { 
      if (err) { 
       return res.send(err); 
      } else if (numAffected == 0) { 
       res.json({ "message": "Not found" }) 
      } else { 
       res.json({ "message": "User updated!" }); 
      } 
     } 
    ); 
}); 

否則使用.findByIdAndUpdate()返回修改的文檔:

apiRouter.put('/images/:user_id/:file_name', function(req, res) { 

    User.findByIdAndUpdate(req.params.user_id, 
     { "$addToSet": {"images": req.params.file_name } }, 
     { "new": true }, 
     function(err,user) { 
      if (err) { 
       return res.send(err); 
      } else if (!user) { 
       res.json({ "message": "Not found" }) 
      } else { 
       res.json(user); 
      } 
     } 
    ); 
}); 

還注意到,這不是如果沒有文件被匹配來執行更新一個err,而是受影響的文檔(或多個)將0或在後者的功能的情況下將不會有文件返回。

當您檢索到文檔並修改了常規代碼中的內容而不是數據庫方法時,您只能使用像.save()這樣的方法。 「檢索/修改/保存」不是一個好習慣,因爲其他操作可能會在發生這些操作之間更新數據庫中的文檔,從而導致覆蓋信息和不一致狀態。

+0

非常感謝您提供的豐富信息。這是非常讚賞。 – meanstacky