2016-06-04 3 views
3

У меня есть сборник документов под названием игры, которая выглядит как этотсумма число появлений на двух полях в MongoDB

{ winner: 'oakis', loser: 'test' }, 
{ winner: 'test', loser: 'oakis' } 

Теперь я хотел бы MongoDB для вывода этого:

{ _id: 'oakis', wins: 1, losses: 1 }, 
{ _id: 'test', wins: 1, losses: 1 } 

я был глядя на агрегацию, mapReduce и отличные без успеха. Я надеюсь, вы можете мне помочь!

EDIT:

У меня есть поле под названием «привязан», который является логическим, а также. Как я могу реализовать связанные игры также в результатах? (Существует также поле для каждого игрока в игре, player1 & player2) Результат должен быть: { _id: 'name', wins: 3, losses: 1, tied: 1 }

EDIT2:

решаемые это так!

db.games.aggregate([ 
    { 
     $project: { 
      scores: [ 
       { name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 }, tied: { $literal: 0 } }, 
       { name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 }, tied: { $literal: 0 } }, 
     { name: '$player1', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } }, 
     { name: '$player2', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } } 
      ] 
     } 
    }, 
    { 
     $unwind: '$scores' 
    }, 
    { 
     $group: { 
      _id: "$scores.name", 
      wins: { $sum: "$scores.wins" }, 
      losses: { $sum: "$scores.losses" }, 
    tied: { $sum: "$scores.tied" } 
     } 
    } 
]) 

ответ

2

С рамками агрегации можно использовать трубопровод, как в следующем. По сути, он сначала проектирует данные в 2-элементный массив формы [{name: $winner, wins: 1, losses: 0}, {name: $loser, wins: 0, losses: 1}], а затем разматывает массив для создания массивов одиночных элементов, которые затем сгруппированы по имени, а суммы выигрышей и потерь суммируются.

games.aggregate(
    [ 
     { 
      $project: { 
       scores: [ 
        { name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 } }, 
        { name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 } } 
       ] 
      } 
     }, 
     { 
      $unwind: '$scores' 
     }, 
     { 
      $group: { 
       _id: "$scores.name", 
       wins: { $sum: "$scores.wins" }, 
       losses: { $sum: "$scores.losses" } 
      } 
     } 
    ] 
) 
+1

Спасибо, работает как шарм. –

+0

У меня есть поле под названием «связанное», которое также является булевым. Как я могу реализовать связанные игры также в результатах? (Также есть поле для каждого игрока в игре, player1 и player2) Результат должен быть: '{_id: 'name', побед: 3, убытков, 1, tied: 1}' –