2015-06-19 68 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控制檯並檢查數據庫中團隊的情況,因爲這會告訴您錯誤在哪裏(因爲我相信這是這樣)。 –