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

Полученный результат:Удаление дубликатов в MongoDB с совокупным запроса

{ "_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" } 
    } 
} 
]) 
Смежные вопросы