Der er et par greb her at forstå.
Når du bruger $group
grænserne vil blive sorteret i den rækkefølge, som de blev opdaget uden hverken en indledende eller afsluttende fase $sort
operation. Så hvis dine dokumenter oprindeligt var i en rækkefølge som denne:
{ uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
Så skal du bare bruge $group
uden en $sort
i enden på pipelinen ville returnere resultater som dette:
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
Det er ét koncept, men det ser faktisk ud til, at det, du forventer i resultater, kræver at returnere de "sidste andre felter" i en sorteret rækkefølge af uid
er det du leder efter. I så fald er måden at få dit resultat faktisk ved at $sort
først og derefter bruge $last
operatør:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"created": { "$last": "$created" },
"another_col": { "$last": "$created" }
}}
])
Eller i det væsentlige anvende sorteringen på det, du ønsker.
Forskellen mellem $last
og $max
er, at sidstnævnte vil vælge den "højeste" værdi for det givne felt inden for grupperingen _id
, uanset den aktuelle sorteret i usorteret rækkefølge. På den anden side, $last
vil vælge den værdi, der forekommer i den samme "række" som den "sidste" gruppering _id
værdi.
Hvis du rent faktisk ledte efter at sortere værdierne af et array, så er tilgangen den samme. Hvis du holder array-medlemmerne i "oprettet" rækkefølge, vil du også sortere først:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"row": {
"$push": {
"created": "$created",
"another_col": "$another_col"
}
}
}}
])
Og dokumenterne med disse felter vil blive tilføjet til arrayet i den rækkefølge, de allerede var sorteret efter.