1

これは機能するはずですか?モデル内のドキュメント ( following) から単一のサブドキュメント ( ) を削除しようとしています。thisUserSchema

UserSchema.methods.unFollow = function( id ) {
var user = this

return Q.Promise( function ( resolve, reject, notify ) {
    var unFollow = user.following.pull( { 'user': id } )

    console.log( unFollow )

    user.save( function ( error, result ) {
        resolve( result )   
    })  
})
}

これらはスキーマです:

var Follows = new mongoose.Schema({
    user: String,
    added: Number
})

var UserSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    following: [ Follows ]
})

ユーザーコントローラー.js

/*
Unfollow user.
*/
exports.unFollow = function ( req, res ) {

    User.findOne( { token: req.token }, function ( error, user ) {
        user.unfollow( req.body.id )
        .onResolve( function ( err, result ) {
            if ( err || !result ) return res.status( 500 ).json( "User could not be unfollowed." )

            return res.status( 200 ).json( "User unfollowed." )
        })
    })
}

ユーザーモデル.js

/*
Unfollow a user.
*/
UserSchema.method( 'unfollow', function unfollow ( id ) {
    this.following.pull( { user: id } )

    return this.save()
})
4

2 に答える 2

3

method通常、次の関数を使用してメソッドを割り当てます。

UserSchema.method('unFollow', function unFollow(id) {
  var user = this;

  user.following.pull({_id: id});
  // Returns a promise in Mongoose 4.X
  return user.save();
});

また、前述のように、マングースの promisesaveを返すため、Q を使用する必要はありません。

更新: Mongoose の配列pullメソッドは一致するプリミティブ値で機能しますが、サブドキュメント オブジェクトでは でのみ一致し_idます。

更新 #2: コントローラーが最初にルックアップを実行し、返されたドキュメントを変更してから、ドキュメントをサーバーに保存していることを示す更新された質問に気付きました。あなたが望むことをするために、メソッドではなく静的を作成してみませんか? これには、操作ごとに 2 回ではなく、DB への 1 回の呼び出しになるという追加のボーナスがあります。

例:

UserSchema.static('unfollow', function unfollow(token, id, cb) {
  var User = this;

  // Returns a promise in Mongoose 4.X
  // or call cb if provided
  return User.findOneAndUpdate({token: token}, {$pull: {follows: {user: id}}}, {new: true}).exec(cb);
});

User.unfollow(req.token, req.body.id).onResolve(function (err, result) {
  if (err || !result) { return res.status(500).json({msg: 'User could not be unfollowed.'}); }

  return res.status(200).json({msg: 'User unfollowed.'})
});

ボーナスfollowスタティック:

UserSchema.static('follow', function follow(token, id, cb) {
  var User = this;

  // Returns a promise in Mongoose 4.X
  // or call cb if provided
  return User.findOneAndUpdate({token: token}, {$push: {follows: {user: id}}}, {new: true}).exec(cb);
});

User.follow(req.token, req.body.id).onResolve(function (err, result) {
  if (err || !result) { return res.status(500).json({msg: 'User could not be followed.'}); }

  return res.status(200).json({msg: 'User followed.'})
});
于 2015-04-08T03:32:48.600 に答える