sql >> Databasteknik >  >> NoSQL >> MongoDB

Flera gruppoperationer med Mongo-aggregationsramverk

Det är viktigt att förstå att operationerna i argumentet to aggregate() bildar en pipeline . Detta innebar att indata till valfritt element i pipelinen är strömmen av dokument som produceras av det föregående elementet i pipelinen.

I ditt exempel skapar din första fråga en pipeline av dokument som ser ut så här:

{
    "_id" : 2,
    "avg_score" : 5.5
},
{
    "_id" : 1,
    "avg_score" : 4
}

Detta betyder att det andra elementet i piplinen ser en serie dokument där de enda nycklarna är "_id" och "avg_score". Nycklarna "category_id" och "score" finns inte längre i den här dokumentströmmen.

Om du vill aggregera ytterligare på den här strömmen måste du aggregera med hjälp av nycklarna som visas i det här skedet i pipelinen. Eftersom du vill beräkna medelvärdena måste du lägga in ett enda konstant värde för fältet _id, så att alla indatadokument grupperas till ett enda resultat.

Följande kod ger det korrekta resultatet:

db.questions.aggregate(
    { $group : {
        _id : "$category_id",
        avg_score : { $avg : "$score" },
        }
    },
    { $group : {
        _id : "all",
        avg_score : { $avg : "$avg_score" },
        }
    }
);

När den körs producerar den följande utdata:

 {
    "result" : [
        {
        "_id" : "all",
        "avg_score" : 4.75
        }
    ],
    "ok" : 1
 }



  1. En lista över index i MongoDB?

  2. Lagra flera versioner av data i Redis cache

  3. Hur kan jag köra redis på en enda server på olika portar?

  4. Hur man genererar ett unikt objekt-id i mongodb