MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Agrégation avec le nombre de sous-documents correspondant à la condition et au groupement

Vous devriez avoir lu la réponse correctement, car il y avait déjà une autre liste alternative et une explication de la raison pour laquelle le résultat attendu que vous voulez de celui que vous avez utilisé serait différent.

Au lieu de cela, vous voulez celui-ci, qui respecte les possibles multiples "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) {

    }
  );

C'est en quelque sorte une "combinaison" d'approches. La première consiste à obtenir le "dernier" par runTime comme vous l'attendiez. La prochaine consiste à décomposer le tableau et cette fois en fait "résumer" les occurrences possibles de réussite ou d'échec, plutôt que de simplement enregistrer un 1 pour la réussite ou l'échec dans le tableau, les "réussite" ou "échec" réels sont comptés.

Avec résultats :

{
        "_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")
}