Je zde několik úlovků, které je třeba pochopit.
Když používáte $group
hranice budou seřazeny v pořadí, v jakém byly objeveny, bez počáteční nebo koncové fáze $sort
úkon. Takže pokud byly vaše dokumenty původně v takovém pořadí:
{ 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" },
Pak stačí použít $group
bez $sort
na konci potrubí by vám vrátil výsledky takto:
{ 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 je jeden koncept, ale ve skutečnosti se zdá, že to, co očekáváte ve výsledcích, vyžaduje vrácení „posledních ostatních polí“ v seřazeném pořadí uid
je to, co hledáte. V takovém případě způsob, jak získat výsledek, je ve skutečnosti $sort
nejprve a poté použijte $last
operátor:
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" }
}}
])
Nebo v podstatě použijte řazení na to, co chcete.
Rozdíl mezi $last
a $max
spočívá v tom, že tento vybere "nejvyšší" hodnotu pro dané pole v rámci seskupení _id
, bez ohledu na aktuální řazení podle neseřazeného pořadí. Na druhou stranu $last
vybere hodnotu, která se vyskytuje ve stejném "řádku" jako "poslední" seskupení _id
hodnotu.
Pokud jste skutečně hledali řazení hodnot pole, pak je přístup podobný. Udržování členů pole v "vytvořeném" pořadí byste také nejprve seřadili:
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 s těmito poli budou přidány do pole v pořadí, ve kterém již byly seřazeny.