Тук има няколко уловки, за да разберете.
Когато използвате $group
границите ще бъдат сортирани в реда, в който са били открити, без начален или краен етап $sort
операция. Така че, ако документите ви първоначално са били в ред като този:
{ 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" },
След това просто използвайте $group
без $sort
в края на конвейера ще ви върне резултати като тези:
{ 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" },
Това е една концепция, но всъщност изглежда, че това, което очаквате в резултатите, изисква връщане на „последните други полета“ по сортиран ред на uid
е това, което търсите. В този случай начинът да получите вашия резултат е всъщност $sort
първо и след това използвайте $lastкод>
оператор:
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" }
}}
])
Или по същество приложете сортирането към това, което искате.
Разликата между $last
и $max
е, че последният ще избере „най-високата“ стойност за даденото поле в рамките на групирането _id
, независимо от текущия сортиран в несортиран ред. От друга страна, $last
ще избере стойността, която се среща в същия „ред“ като „последното“ групиране _id
стойност.
Ако всъщност искате да сортирате стойностите на масив, тогава подходът е подобен. Поддържайки членовете на масива в "създадения" ред, вие също първо бихте сортирали:
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"
}
}
}}
])
И документите с тези полета ще бъдат добавени към масива в реда, по който вече са били сортирани.