2016-12-23 1 views
0

Дано:

db.invoices.find() 

[{"_id":"585c291cb035648543000006","client":"58333caa36f02d14009c50ee","status":"open","amount":150}, 
{"_id":"585c2906b035648543000005","client":"58333caa36f02d14009c50ee","status":"sent","amount":175}, 
{"_id":"585c28fbb035648543000004","client":"58333caa36f02d14009c50ee","status":"paid","amount":375}, 
{"_id":"585c28bab035648543000003","client":"58333caa36f02d14009c50ee","status":"open","amount":400}, 
{"_id":"585c2872b035648543000001","client":"583335ad36f02d14009c3f88","status":"sent","amount":120}, 
{"_id":"585c297db035648543000007","client":"583335ad36f02d14009c3f88","status":"paid","amount":150}] 

Что лучший способ агрегировать эту модель так, что суммы каждого состояния возвращаются в объект с именем отсчеты для каждого клиента:

[{ 
    _id: "58333caa36f02d14009c50ee", 
    amount: 1100, 
    counts: { 
     open: 2, 
     sent: 1, 
     paid: 1 
    } 
}, { 
    _id: "583335ad36f02d14009c3f88", 
    amount: 270, 
    counts: { 
     open: 0, 
     sent: 1, 
     paid: 1 
    } 
}] 

до сих пор я получил информацию агрегирующего правильно, но результаты являются плоскими, и я не уверен, как получить отсчеты вложенные как свойства объекта с именем отсчетов:

[{ 
    $project: { 
     client: 1, 
     status: 1, 
     amount: 1 
    } 
}, { 
    $group: { 
     _id: '$client', 
     amount: { $sum: '$amount'}, 
     open: { 
      $sum: { 
       $cond: { 
        if: { 
         $eq: ["$status", 'open'] 
        }, 
        then: 1, 
        else: 0 
       } 
      } 
     }, 
     sent: { 
      $sum: { 
       $cond: { 
        if: { 
         $eq: ["$status", 'sent'] 
        }, 
        then: 1, 
        else: 0 
       } 
      } 
     }, 
     paid: { 
      $sum: { 
       $cond: { 
        if: { 
         $eq: ["$status", 'paid'] 
        }, 
        then: 1, 
        else: 0 
       } 
      } 
     } 
    } 
}] 

, которая возвращает:

[{ 
    _id: "58333caa36f02d14009c50ee", 
    amount: 1100, 
    open: 2, 
    sent: 1, 
    paid: 1 
}, { 
    _id: "583335ad36f02d14009c3f88", 
    amount: 270, 
    open: 0, 
    sent: 1, 
    paid: 1 
}] 

Я предположил, что я мог бы получить эти отсчеты вложенного путем определения имя_поля в $ группы, как что-то вроде:

$group: { 
    _id: '$client', 
    amount: { $sum: '$amount'}, 
    "counts.open": { 
     $sum: { 
      $cond: { 
       if: { 
        $eq: ["$status", 'open'] 
       }, 
       then: 1, 
       else: 0 
      } 
     } 
    }, 
    .... 
} 

но Монго не позволяют ". в любом определенном поле имени во время шага агрегации группы. Можно ли это сделать во время агрегации манго?

ответ

0

я в конечном итоге добавив последний шаг $ проекта:

{ 
    $project: { 
     client: '$_id', 
     amount: 1, 
     "counts.open": '$open', 
     "counts.sent": '$sent', 
     "counts.paid": '$paid' 
    } 
}