node.js - 使用拉入 Mongoose 模型

标签 node.js mongodb mongoose subdocument

这应该有效吗?我正在尝试从 UserSchema 模型中的文档 (this) 中删除单个子文档 (following)。

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 ]
})
<小时/>

用户 Controller .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()
})

最佳答案

您通常使用 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();
});

此外,如上所述,您不需要将 Q 用作 save将返回 mongoose promise .

更新:Mongoose 的数组 pull方法将适用于匹配原始值,但对于子文档对象,它只会匹配 _id

更新#2:我刚刚注意到您更新的问题表明您的 Controller 首先进行查找,修改返回的文档,然后将文档保存回服务器。为什么不创建静态而不是方法来执行您想要的操作?这样做的额外好处是对数据库进行一次调用,而不是每次操作两次。

示例:

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

奖金遵循静态:

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

关于node.js - 使用拉入 Mongoose 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29504278/

相关文章:

node.js - bcrypt.hash 不调用其回调

javascript - https 请求在 Node.js 中不起作用

node.js - Mongoose:为什么 $addtoset 添加不正确的 ObjectId

javascript - 按 ID 查找并更新嵌套数组元素

c# - 如何在 C# Mongodb 强类型驱动程序中删除嵌套文档数组内的元素

javascript - Mongoose 验证将一个数组与另一个数组匹配以获得公共(public)字符串?

node.js - 用于算术运算的 MongoDB 聚合 - 子文档字段

javascript - 在 Node.js 中嵌套 promise 的情况下 promise 解决/拒绝

javascript - Windows Localhost 中的 Wiki.js 安装

node.js - Mongoose 中的 Date.now() 和 Date.now 有什么区别?