2016-09-04 50 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" } 

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

我已经看到了做这件事的方式似乎与$ 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" } 
    } 
} 
])