使用聚合查询删除mongodb中的重复项

时间:2016-09-04 10:20:45

标签: mongodb duplicates aggregation-framework

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

正如你所看到的那样,最后一个元素是重复的,因为unwind会创建它的两个元素,它应该是它。我怎样才能(在保持查询的聚合结构的同时)保留副本的第一个元素或仅保留副本的最后一个元素?

我已经看到了这样做的方法似乎与$ addToSet或$ setUnion有关(任何细节如何正确地被赞赏),但我不明白我如何选择& #39;子集'我希望通过它来识别重复项(在我的情况下,' GameID',允许其他值不同)以及如何选择我是否需要第一个或最后一个元素。

1 个答案:

答案 0 :(得分:4)

您可以_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" }
   }
 }
])