sql >> Databáze >  >> NoSQL >> MongoDB

Více skupinových operací pomocí agregačního rámce Mongo

Je důležité pochopit, že operace v argumentu pro agregaci() tvoří potrubí . To znamenalo, že vstupem do jakéhokoli prvku kanálu je proud dokumentů vytvořený předchozím prvkem v kanálu.

Ve vašem příkladu váš první dotaz vytvoří kanál dokumentů, které vypadají takto:

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

To znamená, že druhým prvkem pipline je vidět série dokumentů, kde jedinými klíči jsou „_id“ a „avg_score“. Klíče „category_id“ a „score“ již neexistují v tomto streamu dokumentů.

Pokud chcete v tomto streamu dále agregovat, budete muset agregovat pomocí klíčů, které jsou vidět v této fázi kanálu. Protože chcete průměrovat průměry, musíte do pole _id zadat jednu konstantní hodnotu, aby se všechny vstupní dokumenty seskupily do jednoho výsledku.

Následující kód poskytuje správný výsledek:

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

Při spuštění vytváří následující výstup:

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



  1. Představujeme vyhledávací grafy v MongoDB

  2. Nejlepší zdroje MongoDB

  3. rozdíl mezi agregátem ($match) a nálezem v MongoDB?

  4. Nodejs, nečeká na dokončení dotazu Redis, než bude pokračovat v provádění