2016-09-04 27 views
5
db.games.aggregate([ 
{ $unwind : "$rounds"}, 
{ $match: { 
"rounds.round_values.gameStage": "River", 
"rounds.round_values.decision": "BetPlus" } 
}, 
{ $project: {"FinalFundsChange":1, "GameID":1} 
    }]) 

結果として出力されます:削除重複

{ "_id" : ObjectId("57cbce66e281af12e4d0731f"), "GameID" : "229327202", "FinalFundsChange" : 0.8199999999999998 } 
{ "_id" : ObjectId("57cbe2fce281af0f34020901"), "FinalFundsChange" : -0.1599999999999997, "GameID" : "755030199" } 
{ "_id" : ObjectId("57cbea3ae281af0f340209bc"), "FinalFundsChange" : 0.10000000000000009, "GameID" : "231534683" } 
{ "_id" : ObjectId("57cbee43e281af0f34020a25"), "FinalFundsChange" : 1.7000000000000002, "GameID" : "509975754" } 
{ "_id" : ObjectId("57cbee43e281af0f34020a25"), "FinalFundsChange" : 1.7000000000000002, "GameID" : "509975754" } 

あなたは最後の要素をアンワインドはそれがすべきことの2つの要素を作成しますので、それはだ、重複して見ることができるように。どのようにして(クエリの集約構造を維持しながら)、複製の最初の要素を保持するか、複製の最後の要素のみを保持することができますか?

$ addToSetまたは$ setUnion(これがどのように正確に機能するかについての詳細はよく分かります)と関連があるようですが、私はどのように 'サブセット'私は重複を識別したい(私の場合は' GameID 'で、他の値は異なることが許されています)、どのようにして最初の要素か最後の要素かを選択できます。

答えて

3

_idを介して$groupにグループ化し、それぞれ最後の値または最初の値を保持するためにそれぞれ$lastおよび$first演算子を使用できます。

db.games.aggregate([ 
{ $unwind : "$rounds"}, 
{ $match: { 
"rounds.round_values.gameStage": "River", 
"rounds.round_values.decision": "BetPlus" } 
}, 
{ $group: { 
    _id: "$_id", 
    "FinalFundsChange": { $first: "$FinalFundsChange" }, 
    "GameID": { $last: "$GameID" } 
    } 
} 
])