2013-08-07 43 views
0

我遇到與Mongoose/MongoDB行爲我不明白。即使沒有指定用戶,Mongoose也會從數組中刪除用戶。Mongoose/MongoDB刪除模型的數組中的項目,但沒有說明哪個項目

這裏的模式:

var DocSchema = new Schema({ 
    doc_id : String, 
    users: [String], 
}); 

這裏是控制器從數組中刪除用戶:當我想從數組中刪除tom

exports.remove_user = function(req, res) { 
    doc_id = req.body.doc_id; 
    username = req.body.username; 
    Document.findOne({doc_id: doc_id}, function(err, doc_data) { 
    if (err) { 
     throw (err); 
    } else { 
     var users = doc_data.users; 
     var index = users.indexOf(username); 
     users.splice(index, 1); 
     doc_data.save(function(err) { 
     if (err) { 
      throw (err); 
     } else { 
      console.log('removed user from doc'); 
      return res.send(doc_data); 
     } 
     }); 
    } 
    }); 
}; 

這PUT請求工作正常(和只有tom):

jQuery.ajax({ 
    url: '/remove_user', 
    type: 'PUT', 
    data: { 
     'doc_id': 66865270, 
     'username': 'tom' 
    }, 
    success: function(data, textStatus, jqXHR) { 
     console.log('Post response:'); 
     console.dir(data); 
     console.log(textStatus); 
     console.dir(jqXHR); 
    } 
}); 

但是,假設tom不存在,或者已經從數組中移除,那麼當我使用'username': 'tom'執行相同的PUT請求時,MongoDB將看似任意刪除另一個用戶。

如何正確確保只有明確聲明的用戶名被刪除?

回答

0

您錯誤地使用了splice

var users = ['tom', 'dick', 'harry']; 
var index = users.indexOf('john'); 
users.splice(index, 1); 
console.log(users); 
//[ 'tom', 'dick' ] 

這不是任意的,你不檢查是否index >= 0。您可以通過只是改變你的條件完全避免這種情況:

Document.findOne({doc_id: doc_id, users: username}, function(err, doc_data) { 

該查詢將返回null doc_data如果doc.users不包含用戶名。或者您可以在致電splice之前查看index