MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Agregar com contagem de subdocumentos que correspondem à condição e ao agrupamento


Você deve ter lido a resposta corretamente, pois já havia outra lista alternativa e explicação de por que o resultado esperado que você deseja do que você usou seria diferente.

Em vez disso, você quer este, que respeita os possíveis múltiplos "PASS" ou "FAIL":
  Model.aggregate(
    [
      { "$sort": { "executionProject": 1, "runEndTime": 1 } },
      { "$group": {
        "_id": "$executionProject",
        "suiteList": { "$last": "$suiteList" },
        "runEndTime": { "$last": "$runEndTime" }
      }},
      { "$unwind": "$suiteList" },
      { "$group": {
        "_id": "$_id",
        "suite-pass": { 
          "$sum": {
            "$cond": [
              { "$eq": [ "$suiteList.suiteStatus", "PASS" ] },
              1,
              0
            ]
          }
        },
        "suite-fail": { 
          "$sum": {
            "$cond": [
              { "$eq": [ "$suiteList.suiteStatus", "FAIL" ] },
              1,
              0
            ]
          }
        },
        "runEndTime": {"$first": "$runEndTime"}
      }},
      { "$sort": { "runEndTime": 1 }}
    ],
    function(err,result) {

    }
  );

O que é uma espécie de "combinação" de abordagens. A primeira é pegar o "último" pelo runTime como você esperava. O próximo é quebrar a matriz e desta vez realmente "soma" as possíveis ocorrências de aprovação ou falha, em vez de apenas gravar um 1 para aprovação ou reprovação na matriz, o "aprovado" ou "reprovado" real são contados.

Com resultados:
{
        "_id" : "Project1",
        "suite-pass" : 0,
        "suite-fail" : 1,
        "runEndTime" : ISODate("2015-08-19T09:46:31.108Z")
}
{
        "_id" : "Project2",
        "suite-pass" : 2,
        "suite-fail" : 0,
        "runEndTime" : ISODate("2015-08-19T11:09:52.537Z")
}
{
        "_id" : "Project3",
        "suite-pass" : 0,
        "suite-fail" : 1,
        "runEndTime" : ISODate("2015-08-19T11:18:41.460Z")
}