Da du grupperer på dokumentet _id
du kan blot placere de felter, du ønsker at beholde, i grupperingen _id
. Derefter kan du omforme ved hjælp af $project
db.c.aggregate([
{ "$unwind": "$array_to_sort"},
{ "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
{ "$group": {
"_id": {
"_id": "$_id",
"unknown_field": "$unknown_field"
},
"Oarray_to_sort": { "$push":"$array_to_sort"}
}},
{ "$project": {
"_id": "$_id._id",
"unknown_field": "$_id.unknown_field",
"array_to_sort": "$Oarray_to_sort"
}}
]);
Det andet "trick" derinde er at bruge et midlertidigt navn til arrayet i grupperingsstadiet. Dette er tilfældet, når du $projekt
og ændre navnet, får du felterne i den rækkefølge, der er angivet i projektionssætningen. Hvis du ikke gjorde det, ville feltet "array_to_sort" ikke være det sidste felt i rækkefølgen, da det er kopieret fra det foregående trin.
Det er en tilsigtet optimering i $project
, men hvis du vil have ordren så kan du gøre det som ovenfor.
For helt ukendte strukturer findes mapReduce måden at gøre tingene på:
db.c.mapReduce(
function () {
this["array_to_sort"].sort(function(a,b) {
return a.a - b.a || a.b - b.b;
});
emit( this._id, this );
},
function(){},
{ "out": { "inline": 1 } }
)
Det har selvfølgelig et outputformat, der er specifikt for mapReduce og derfor ikke lige det dokument, du havde, men alle felterne er indeholdt under "værdier":
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 0,
"some_field" : "a",
"array_to_sort" : [
{
"a" : 1,
"b" : 0
},
{
"a" : 3,
"b" : 3
},
{
"a" : 3,
"b" : 4
}
]
}
}
],
}
Fremtidige udgivelser (i skrivende stund) giver dig mulighed for at bruge en $$ROOT
variabel i aggregeret for at repræsentere dokumentet:
db.c.aggregate([
{ "$project": {
"_id": "$$ROOT",
"array_to_sort": "$array_to_sort"
}},
{ "$unwind": "$array_to_sort"},
{ "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
{ "$group": {
"_id": "$_id",
"array_to_sort": { "$push":"$array_to_sort"}
}}
]);
Så det nytter ikke at bruge det sidste "projekt"-stadium, da du faktisk ikke kender de andre felter i dokumentet. Men de vil alle være indeholdt (inklusive det originale array og rækkefølge ) i _id
felt i resultatdokumentet.