1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

MongoDB - group()

Dieses Thema im Forum "Andere Datenbankserver" wurde erstellt von werdas34, 7 Dezember 2018.

  1. werdas34

    werdas34 Benutzer

    Hallo,

    ich habe folgende Aufgabe bekommen:
    Gruppierung: Die Anzahlen der Forscher und die durchschnittliche Wochenarbeitszeit der Forscher pro Uni.
    (group()-Methode mit den Parametern key, initial, result und finalize).
    (Vorgehensweise: zunächst die Anzahl der Forscher berechnen (key, intitial, result), dann die Anfrage um die Berechnung der Summen der Arbeitszeiten der Forscher erweitern (wiederum key, initial, result), dann die Anfrage um die Berechnung der Durchschnitte der Summen der Arbeitszeiten der Forscher erweitern (wiederum key, initial, result und zusätzlich finalize). Ich schätze statt result sollte reduce stehen.

    Nun nach dem ersten Schritt sieht es so:
    Code:
    db.forscher.group({
       key: {uniname:1},
       reduce: function(cur, result) {result.fname += 1; },
       initial: {fname: 0 },
       key: {uniname:2},
    })
    
    Das Ergebnis ist richtig:

    Nun erweitere ich es um den zweiten Schritt:
    Code:
    db.forscher.group({
       key: {uniname:1},
       reduce: function(cur, result) {result.fname += 1; },
       initial: {fname: 0 },
       key: {uniname:2},
       reduce: function(cur, result) {result.wochenarbeitszeit += cur.wochenarbeitszeit;},
       initial: {wochenarbeitszeit: 0 }
    })
    
    Da wird mir nur der Uniname, aber nicht die Anzahl der Forscher ausgegeben. Obwohl die vorherige Abfrage stimmt.
    Wie mache ich das, damit beide rauskommen? Finde im Internet nichts dazu, außer die Dokumentation von MongoDB und Beispiele für das aggragate-Framework.
    Oder muss man da dann eine eigene Abfrage schreiben und die zusammenfügen? Aber wie? Im Skript steht dazu auch nichts.

    Kann mir dann jemand zusätzlich verraten, wozu ich finalize am Ende brauche?
    Mit dem letzten reduce würde ich dann die Wochenarbeitszeit geteilt der Anzahl der Forscher berechnen.
    Was steht dann in der function von finalize drin?

    Datensatz:
    Code:
    db.forscher.insert ( {
         fname: "Galilei",
         gebdatum: "1648-01-21",
         uniname: "TU Muenchen",
         einstelldatum: "1696-02-23",
         projektname: "Mond",
         wochenarbeitszeit: 40
    } );
    
    db.forscher.insert ( {
         fname: "Newton",
         gebdatum: "1712-02-10",
         uniname: "HS Landshut",
         einstelldatum: "1741-03-11",
         projektname: "Kometen",
         wochenarbeitszeit: 15
    } );
    
    db.forscher.insert ( {
         fname: "Einstein",
         gebdatum: "1888-05-21",
         uniname: "HS Rosenheim",
         einstelldatum: "1912-07-04",
         projektname: "Jupiter",
         wochenarbeitszeit: 4
    } );
    
    db.forscher.insert ( {
         fname: "Nernst",
         gebdatum: "1928-07-12",
         uniname: "HS Landshut",
         einstelldatum: "1939-08-01",
         projektname: "Sonne",
         wochenarbeitszeit: 21
    } );
    
    db.forscher.insert ( {
         fname: "Sommerfeld",
         gebdatum: "1899-11-16",
         uniname: "Uni Passau",
         einstelldatum: "1934-12-09",
         projektname: "Sonne",
         wochenarbeitszeit: 15
    } );
    
    db.forscher.insert ( {
         fname: "Planck",
         gebdatum: "1848-05-07",
         uniname: "TU Muenchen",
         einstelldatum: "1871-11-15",
         projektname: "Milchstrasse",
         wochenarbeitszeit: 30
    } );
    
    db.forscher.insert ( {
         fname: "Sandage",
         gebdatum: "1923-01-09",
         uniname: "HS Rosenheim",
         einstelldatum: "1946-02-25",
         projektname: "Centauri",
         wochenarbeitszeit: 3
    } );
    
    db.forscher.insert ( {
         fname: "Leibnitz",
         gebdatum: "1723-07-11",
         uniname: "HS Landshut",
         einstelldatum: "1753-04-11",
         projektname: "Hubble",
         wochenarbeitszeit: 8
    } );
    
    db.forscher.insert ( {
         fname: "Cassini",
         gebdatum: "1543-04-16",
         uniname: "TU Muenchen",
         einstelldatum: "1526-04-30",
         projektname: "Mond",
         wochenarbeitszeit: 40
    } );
    
    db.forscher.insert ( {
         fname: "Kepler",
         gebdatum: "1601-03-19",
         uniname: "TU Muenchen",
         einstelldatum: "1631-11-01",
         projektname: "Pluto",
         wochenarbeitszeit: 19
    } );
    
    db.forscher.insert ( {
         fname: "Herschel",
         gebdatum: "1702-12-25",
         uniname: "HS Deggendorf",
         einstelldatum: "1744-09-15",
         projektname: "Sonne",
         wochenarbeitszeit: 20
    } );
    
    db.forscher.insert ( {
         fname: "Petrarca",
         gebdatum: "1248-04-23",
         uniname: "TU Muenchen",
         einstelldatum: "1296-08-30",
         projektname: "Mond",
         wochenarbeitszeit: 40
    } );
    
    db.forscher.insert ( {
         fname: "Erasmus",
         gebdatum: "1648-01-21",
         uniname: "HS Deggendorf",
         einstelldatum: "1696-02-23",
         projektname: "Mond",
         wochenarbeitszeit: 40
    } );
    
    db.forscher.insert ( {
         fname: "Gauss",
         gebdatum: "1697-08-01",
         uniname: "Uni Passau",
         einstelldatum: "1733-02-07",
         projektname: "Pulsare",
         wochenarbeitszeit: 6
    } );
    
    db.forscher.insert ( {
         fname: "Lavoisier",
         gebdatum: "1745-07-22",
         uniname: "TU Muenchen",
         einstelldatum: "1777-04-27",
         projektname: "Milchstrasse",
         wochenarbeitszeit: 25
    } );
    
    db.forscher.insert ( {
         fname: "Baade",
         gebdatum: "1901-09-16",
         uniname: "Uni Passau",
         einstelldatum: "1931-02-22",
         projektname: "Centauri",
         wochenarbeitszeit: 10
    } );
    
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden