0

我遇到了我不理解的 Mongoose/MongoDB 行为。即使没有指定用户,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 请求工作正常:

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'.

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

4

1 回答 1

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) {

如果不包含该用户名,该查询将返回一个nulldoc_data 。doc.users或者你可以index在打电话之前检查一下splice

于 2013-08-07T03:02:24.090 回答