MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aggregieren mit der Anzahl der Unterdokumente, die der Bedingung und Gruppierung entsprechen

Sie sollten die Antwort richtig gelesen haben, da es bereits eine andere alternative Auflistung und Erklärung gab, warum das erwartete Ergebnis, das Sie möchten, von dem von Ihnen verwendeten abweichen würde.

Stattdessen möchten Sie diese, die das mögliche Mehrfach "PASS" oder "FAIL" respektiert:

  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) {

    }
  );

Das ist eine Art "Kombination" von Ansätzen. Die erste besteht darin, das "letzte" von runTime zu erhalten, wie Sie es erwartet haben. Als nächstes wird das Array zerlegt und dieses Mal tatsächlich die möglichen Pass- oder Fail-Vorkommen "summiert", anstatt nur eine 1 aufzuzeichnen für entweder bestanden oder nicht bestanden im Array wird das tatsächliche „bestanden“ oder „nicht bestanden“ gezählt.

Mit Ergebnissen:

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