sql >> Database teknologi >  >> NoSQL >> MongoDB

Få optælling af logniveau for hvert navn

Fjern { "$sum": 1 } og { "$sum": 0 } udtryk i din if/else betingede blokke, erstatte dem med værdierne 1 og 0 (henholdsvis for hver betinget blok).

Den endelige pipeline skulle se sådan ud ved at bruge den anden $cond syntaks, som udelader if/else blokke:

db.names.aggregate([
    {
        "$group": {
            "_id": "$name",
            "error": { 
               "$sum": { 
                   "$cond": [ { "$eq": [ "$loglevel",  "ERROR" ] }, 1, 0] 
               }
           },
           "warning":{
               "$sum": { 
                   "$cond": [ { "$eq": [ "$loglevel", "WARNING" ] }, 1, 0 ]
                }
           },
           "info": { 
               "$sum": { 
                   "$cond": [ { "$eq": [ "$loglevel",  "INFO" ] }, 1, 0 ]
               }
           }
        }
    }
])

Eller opret rørledningen dynamisk, givet en række mulige statusser:

var statuses = ["ERROR", "WARNING", "INFO"],
    groupOperator = { "$group": { "_id": "$name" } };

statuses.forEach(function (status){ 
    groupOperator["$group"][status.toLowerCase()] = { 
       "$sum": { 
           "$cond": [ { "$eq": [ "$loglevel",  status ] }, 1, 0] 
       }
   }
});

db.names.aggregate([groupOperator]);

Output

/* 1 */
{
    "_id" : "t1",
    "error" : 2,
    "warning" : 3,
    "info" : 1
}

/* 2 */
{
    "_id" : "t2",
    "error" : 4,
    "warning" : 0,
    "info" : 1
}

/* 3 */
{
    "_id" : "t3",
    "error" : 0,
    "warning" : 0,
    "info" : 1
}


  1. Mongo Aggregation:$group og $project array til at gøre indsigelse for tællinger

  2. Mongodb hvordan indsætter man KUN hvis den ikke eksisterer (ingen opdatering hvis den findes)?

  3. For loop in redis med nodejs asynkrone anmodninger

  4. Sådan indstilles udløb til flere nøgler i Redis