Node.js Mongoose/MongoDB删除型号'中的项目;s数组,但不说明哪个项

Node.js Mongoose/MongoDB删除型号'中的项目;s数组,但不说明哪个项,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我遇到猫鼬/猫鼬的行为,我不理解。Mongoose正在从阵列中删除用户,即使没有指定用户 以下是模式: var DocSchema = new Schema({ doc_id : String, users: [String], }); 以下是从阵列中删除用户的控制器: exports.remove_user = function(req, res) { doc_id = req.body.doc_id; username = req.body.username; Doc

我遇到猫鼬/猫鼬的行为,我不理解。Mongoose正在从阵列中删除用户,即使没有指定用户

以下是模式:

var DocSchema = new Schema({
  doc_id  : String,
  users: [String],
});
以下是从阵列中删除用户的控制器:

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 );
        }
      });
    }
  });
};
当我想从数组中删除
tom
时(并且仅
tom
),该PUT请求工作正常:

但是,假设
tom
不存在,或者已经从数组中删除,当我使用
'username':'tom'
执行相同的PUT请求时,MongoDB似乎会任意删除另一个用户


如何正确地确保仅删除明确声明的用户名?

您使用的
splice
不正确

var users = ['tom', 'dick', 'harry'];
var index = users.indexOf('john');
users.splice(index, 1);
console.log(users);
//[ 'tom', 'dick' ]
这不是任意的,您没有检查
索引>=0
。您可以通过更改标准来完全避免这种情况:

Document.findOne({doc_id: doc_id, users: username}, function(err, doc_data) {
如果
doc.users
不包含该用户名,则该查询将返回
null
doc\u数据。或者,您可以在调用
splice
之前检查
index

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