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

Die resultierende Ausgabe ist:Entfernen Duplikate in mongodb mit Aggregatabfrage

{ "_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" } 

Wie Sie das letzte Element ist ein Duplikat sehen, das ist, weil die Abwickelstation zwei Elemente schafft, das es sein sollte. Wie kann ich (während ich die Aggregatstruktur der Abfrage behalte) das erste Element des Duplikats beibehalten oder nur das letzte Element des Duplikats beibehalten?

Ich habe gesehen, dass die Wege, um es zu tun scheinen zu entweder $ addToSet oder $ setUnion (alle Details, wie dies genau funktioniert geschätzt werden), aber ich verstehe nicht, wie ich die 'Teilmenge wählen kann ', mit dem ich die Duplikate identifizieren möchte (in meinem Fall ist das die' GameID ', andere Werte dürfen unterschiedlich sein) und wie kann ich wählen, ob ich das erste oder das letzte Element haben möchte.

Antwort

3

Sie könnten Gruppe von _id über $group und dann die jeweils $last und $first Operator die letzten oder ersten Werte zu halten.

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" } 
    } 
} 
])