Jest tu kilka haczyków do zrozumienia.
Gdy używasz $group
granice zostaną posortowane w kolejności, w jakiej zostały odkryte, bez etapu początkowego lub końcowego $sortuj
operacja. Więc jeśli Twoje dokumenty były pierwotnie w takiej kolejności:
{ 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" },
Następnie wystarczy użyć $group
bez $sort
na końcu potoku zwróci wyniki w następujący sposób:
{ 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" },
To jedna koncepcja, ale wygląda na to, że to, czego oczekujesz w wynikach, wymaga zwrócenia „ostatnich innych pól” według posortowanej kolejności uid
jest tym, czego szukasz. W takim przypadku sposobem na uzyskanie wyniku jest w rzeczywistości $sort
najpierw, a następnie skorzystaj z $last
operator:
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" }
}}
])
Lub zasadniczo zastosuj rodzaj do tego, co chcesz.
Różnica między $last
i $max
jest to, że ten ostatni wybierze "najwyższą" wartość dla danego pola w ramach grupy _id
, niezależnie od bieżącego posortowanego w nieposortowanej kolejności. Z drugiej strony $last
wybierze wartość, która występuje w tym samym „wierszu” co „ostatnie” grupowanie _id
wartość.
Jeśli rzeczywiście chciałbyś posortować wartości tablicy, podejście jest podobne. Utrzymując elementy tablicy w „utworzonej” kolejności, należy najpierw posortować:
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"
}
}
}}
])
A dokumenty z tymi polami zostaną dodane do tablicy w kolejności, w jakiej zostały już posortowane.