Wie bekomme ich den maximalen Wert eines Feldes für jede Gruppe mit dem Array der entsprechenden Dokumente?

8

Ich habe eine Sammlung wie

%Vor%

Ich möchte die Ergebnisse mit dem höchsten Gehalt von jeder Abteilung haben

%Vor%

Ich könnte das höchste Gehalt bekommen. Aber ich konnte die entsprechenden Angestelltennamen nicht bekommen.

%Vor%

Könnte mir jemand helfen?

    
dapangmao 30.11.2015, 21:02
quelle

3 Antworten

7

Sie müssen $sort Ihr Dokument nach $unwind und verwenden Sie den $first im $group Bühne. Sie können auch den $last -Operator verwenden. In diesem Fall müssen Sie Ihre Dokumente sortieren in aufsteigender Reihenfolge

%Vor%

welches produziert:

%Vor%

Um die maximale Gehalts- und Mitarbeiterliste für jede Abteilung zurückzugeben, müssen Sie die $max $push Akkumulatoroperator, um eine Liste von "Name" und "Gehalt" für alle Mitarbeiter für jede Gruppe zurückzugeben. Von dort müssen Sie den $map -Operator in Ihrem $project Phase, um neben dem Höchstgehalt eine Liste von Namen zurückzugeben. Natürlich wird hier der $cond verwendet, um das Gehalt jedes Mitarbeiters mit dem Höchstwert zu vergleichen. Der $setDifference erledigt seine Arbeit, die alle false ausfiltert und in Ordnung ist solange die zu filternden Daten "eindeutig" sind. In diesem Fall sollte es "in Ordnung" sein, aber wenn zwei Ergebnisse den gleichen "Namen" enthielten, würde es die Ergebnisse verzerren, wenn man die beiden als eins betrachtet.

%Vor%

was ergibt:

%Vor%     
styvane 30.11.2015, 21:35
quelle
3

Es ist nicht die intuitivste Sache, aber statt $max sollten Sie $sort und $first verwenden:

%Vor%

Alternativ denke ich, dass dies mit dem $$ROOT -Operator möglich ist ( faire Warnung: Ich habe das nicht wirklich versucht) -

%Vor%     
David Grinberg 30.11.2015 21:35
quelle
1

Eine andere mögliche Lösung:

%Vor%

Diese Lösung nutzt den $ eq -Operator, um zwei Felder in $ project Bühne.

Testfall:

%Vor%

Ergebnis:

%Vor%     
joao 30.11.2015 22:12
quelle