1

Iは、2つのマングーススキーマ/モデルを有しています。 1つはTeamのプレイヤー用、もう1つはPlayers用です。Mongoの - いくつかのREFオブジェクト配列内の値の合計

チーム

// Other less relevant stuff 
goalkeepers: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Player' 
}], 
defenders: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Player' 
}], 
midfielders: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Player' 
}], 
attackers: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Player' 
}], 
points: Number 

プレーヤー

// Other less relevant stuff 
points: Number 

の問題は、私は、各位置配列にPlayersのすべてのポイントの合計になるようにTeamポイントを必要とするということです。

現在私が検討している領域はMongoDB集約関数であり、特に$sumですが、例のどれもrefオブジェクトはありません。ポイント値が読み取れるようにオブジェクトを最初に配置する必要があります。

誰かが前にこの問題に遭遇していなければならないような気がしますが、私の検索では、残念ながら無駄にしました。

答えて

0

refフィールドの結合を行うには、$lookup演算子を使用できます。しかし、最初にあなたが_idすべてのプレーヤーを持ってフィールドを作成する必要があると思い、それを行うための最善のオペレータは、二つ以上の配列を受け取り、任意の入力配列に表示される要素を含む配列を返します$setUnionオペレータだろう。あなたは、その後denormalise$lookupの準備のために参加することができる1つの配列にプレーヤー、参考文献を持つすべての配列フィールドを組み合わせることができますこれはどこ$projectパイプラインステージ内に理想的です。

は、以下の集約パイプラインを考えてみましょう:

Team.aggregate([ 
    { 
    "$project": { 
     "players": { 
     "$setUnion": [ 
      "$goalkeepers", 
      "$defenders", 
      "$midfielders", 
      "$attackers" 
     ] 
     } 
    }  
    }, 
    { "$unwind": "$players" }, 
    { 
    "$lookup": { 
     "from": "players", 
     "localField": "players", 
     "foreignField": "_id", 
     "as": "resultingArray" 
    } 
    }, 
    { "$unwind": "$resultingArray" }, 
    { 
    "$group": { 
     "_id": "$_id", 
     "total": { "$sum": "$resultingArray.points" } 
    } 
    } 
], function(err, result){ 
    console.log(result); 
}); 
+1

どうもありがとう! $ lookupにはもっと新しいバージョンのMongoDBが必要だと言いたいだけです。 3.2 +私は信じています。これは2.6.2では動作しません。 – Harry

関連する問題