2014-08-29 62 views
2

的記錄數我想轉換爲使用貓鼬聚合方法有這樣一句話:

「對於每一個球員給OID,選擇已經玩過的最遊戲」。 這裏是我的遊戲模式:

gameSchema = new mongoose.Schema({ 
    game_name:{type:String}, 
    game_id:{type:String}, 
    oid:{type: String}, 
    number_plays:{type:Number,default:0}, 
    }) 
Game = mongoose.model('Game', gameSchema); 

這裏是我使用的代碼:

var allids = ['xxxxx','yyyy']; 
Game.aggregate([ 
    {$match: {'oid': {$in:allids}}}, 
    {$sort: {'number_plays': -1}}, 
    {$group: { 
     _id: '$oid', 
     plays:{$push:"$number_plays"}, 
     instructions:{$push:"$game_instructions"} 
    }} 
], function(err,list){ 
    console.log(list); 
    res.end(); 
}); 

上面的代碼返回如下:

[ { _id: 'yyyy', plays: [ 10,4,5 ] }, 
    { _id: 'xxxxx', 
    plays: [ 28, 14, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } ] 

的問題是,它返回所有遊戲,而不是主要玩過的遊戲。所以我的問題是:是否可以限制填充在$組中的字段?

回答

2

您可以使用$first取值從第一文檔各組排序的管道中:

var allids = ['xxxxx','yyyy']; 
Game.aggregate([ 
    {$match: {'oid': {$in:allids}}}, 
    {$sort: {'number_plays': -1}}, 
    {$group: { 
     _id: '$oid', 
     game_name: {$first: "$game_name"}, 
     game_id: {$first: "$game_id"}, 
     number_plays: {$first:"$number_plays"} 
    }} 
], function(err,list){ 
    console.log(list); 
    res.end(); 
}); 

因爲你對number_plays在管道的前級遞減排序,這將採取來自每個oid組的文檔的最高值爲number_plays