2016-09-04 3 views
1

Я работаю под базой данных MongoDB и у меня есть эта коллекция:Совокупный результат в MongoDB с расчетом

Что у меня есть?

{ 
Name : "David", 
Type : "First", 
Score : 1.66 
} 

{ 
Name : "David", 
Type : "Second", 
Score : 0.66 
} 

{ 
Name : "Naim", 
Type : "First", 
Score : 0.33 
} 

{ 
Name : "Naim", 
Type : "Second", 
Score : 0.10 
} 

{ 
Name : "Joe", 
Type : "First", 
Score : 1.10 
} 
{ 
Name : "Joe", 
Type : "Second", 
Score : 2 
} 

Что я хочу?

Я хочу, чтобы агрегировать результат таким образом:

{ 
Name : "David", 
Type : "First", 
Score : 1.66/(0.33 + 1.10) // first scores for other documents 
} 

{ 
Name : "David", 
Type : "Second", 
Score : 0.66/(0.10 + 2) // second scores for other documents 
} 

И то же самое для других имен ...

Пожалуйста Как я могу добиться выше?

+0

Существует способ решить эту проблему только с помощью db.aggregate команды или что-то просто с помощью мангуста? –

ответ

1

Поскольку это выглядит как простое решение для мира sql (где мы имеем выражения CTE), то с использованием mongo мы можем использовать фазу $lookup для имитации CTE.

Сначала мы вычисляем сумму на одну тестовую группу, затем присоединяем к исходным данным и используя некоторые арифметические операции в фазе $project, вычислим результат.

db.dp.aggregate([{ 
      $group : { 
       _id : "$Type", 
       "SumScore" : { 
        $sum : "$Score" 
       } 
      } 
     }, { 
      $lookup : { 

       from : "dp", 
       localField : "_id", 
       foreignField : "Type", 
       as : "lookUp" 
      } 
     }, { 
      $unwind : "$lookUp" 
     }, { 
      $project : { 
       _id : 0, 
       "Name" : "$lookUp.Name", 
       "Type" : "$_id", 
       "Score" : { 
        $divide : ["$lookUp.Score", { 
          $subtract : ["$SumScore", "$lookUp.Score"] 
         } 
        ] 
       } 
      } 
     } 
    ]) 

и выход:

{ 
    "Name" : "David", 
    "Type" : "First", 
    "Score" : 1.16083916083916 
} 

{ 
    "Name" : "Naim", 
    "Type" : "First", 
    "Score" : 0.119565217391304 
} 

{ 
    "Name" : "Joe", 
    "Type" : "First", 
    "Score" : 0.552763819095477 
} 

{ 
    "Name" : "David", 
    "Type" : "Second", 
    "Score" : 0.314285714285714 
} 

{ 
    "Name" : "Naim", 
    "Type" : "Second", 
    "Score" : 0.037593984962406 
} 

{ 
    "Name" : "Joe", 
    "Type" : "Second", 
    "Score" : 2.63157894736842 
}