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 );
        }
      });
    }
  });
};

この PUT リクエストtomは、配列から削除する場合 (およびのみ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。MongoDB は、同じ PUT リクエストを'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に確認することもできます。indexsplice

于 2013-08-07T03:02:24.090 に答える