2015-06-19 47 views
0

所以我有用户和团队。我希望团队拥有一组用户,并使用addUser函数向团队添加用户。我成功推送到团队用户数组并保存结果,但在该函数之后,我将打印出相同的团队,并且阵列中没有用户。我不确定这是一个.save()问题还是什么。猫鼬 - 无法保存文档的属性

任何帮助表示赞赏,谢谢。

... 

var userSchema = new Schema({ 
    name: { type: String, required: true, unique: true }, 
    age: Number 
}); 
var teamSchema = new Schema({ 
    name: { type: String, required: true, unique: true }, 
    user: [{ type: Schema.ObjectId, ref: 'User' }] 
}); 
userSchema.statics.createUser = function(opts, cb) {...}; 
teamSchema.statics.createTeam = function(opts, cb) {...}; 

teamSchema.statics.addUser = function(opts, cb) { 
    Team.find({_id: opts.team}).exec(function (err, team) { 
    team[0].user.push(opts.user); 
    team[0].save(function(err, save) { 
     console.log("--------------------"); 
     console.log(team[0]); //team contains the added user here 
     console.log("--------------------"); 
     return cb(null); 
    }); 
    }); 
}; 

var User = mongoose.model('User', userSchema); 
var Team = mongoose.model('Team', teamSchema); 

var async = require('async'); 
var user1; 
var user2; 
var team; 

async.waterfall([ 
    function(d){User.createUser({name :'test1'},function(err, user){ 
      user1 = user; 
      d(err); 
    }); 
    }, 

    function(d){User.createUser({name :'test2',age :20},function(err, user){ 
      user2 = user; 
      d(err); 
    }); 
    }, 

    function(d){Team.createTeam({name :'team'},function(err, obj){ 
      team = obj; 
      d(err); 
    }); 
    }, 
    function(d){Team.addUser({user : user1._id,team : team._id}, function(err){ 
      console.log(team); 
      d(err); 
    }); 
    }, 
    function(d){Team.addUser({user : user2._id,team : team._id},  function(err){ 
       console.log(team); 
       d(err); 
    }); 
    } 

],function(err){ 
    if(err){ 
      console.log(err); 
    } 
    else{ 
     User.count({},function(err,count){console.log("Number of users:", count);}); 
     Team.count({},function(err,count){console.log("Number of teams:", count);}); 
     console.log(team); 
    } 

    }); 


returns: 
-------------------- 
{ _id: 5583ed760958ab941a58bae9, 
    name: 'team', 
    __v: 1, 
    user: [ 5583ed760958ab941a58bae7 ] } //user1 added 
-------------------- 
{ __v: 0, name: 'team', _id: 5583ed760958ab941a58bae9, user: [] } 
//after that function call the team has no users 
-------------------- 
{ _id: 5583ed760958ab941a58bae9, 
    name: 'team', 
    __v: 2, 
    user: [ 5583ed760958ab941a58bae7, 5583ed760958ab941a58bae8 ] } 
//user2 added and user1 still there 
-------------------- 
{ __v: 0, name: 'team', _id: 5583ed760958ab941a58bae9, user: [] } //no users again 
Number of users: 2 
Number of teams: 1 //only 1 team exists 

回答

2

也许尝试使用更新和推,这也将简化您的代码?

findAndModify(MongoDB的命令)

findOneAndUpdate(猫鼬命令)

Team.findOneAndUpdate({"_id" : opts.team} , {$addToSet : { "user" : opts.user}}, function (err, foundUpdatedTeam) { 
    return cb(err,foundUpdatedTeam); 
}, {new : true}); 

// be sure to update your team variable to reflect what is also in the database. 

是这样的:

function(d){Team.addUser({user : user1._id,team : team._id}, function(err, updatedTeam)   
{ 
    team = updatedTeam; 
    console.log(team); 
    d(err); 
}); 

几个注意事项:

  1. 我会CH从用户到团队用户的团队模式或更具描述性的东西......现在有点混乱。
  2. 请注意使用AddToSet,这可以确保如果您已经添加了该用户,您将不会再添加两次。
  3. 此代码更短,更清洁,如果您可以使用专用功能,则无需查找对象,但是如果您希望将用户添加到多个团队中,我会使用更新,它允许您更新多个文档。
+0

我似乎遇到了添加用户的相同问题,但最终没有团队中的用户。 – Albo

+1

当然,因为updateOne不会返回新的更新文档,除非您要求它。请检查文档..我会为您更新答案。 –

+2

加上你有另一个问题,我想你不会返回更新对象的团队变量。为了安全起见,您也可以在完成所有循环后查询团队,我还建议您运行mongo控制台并检查数据库中团队的情况,因为这会告诉您错误在哪里(因为我相信这是这样)。 –