Eftersom du grupperar på dokumentet _id
du kan helt enkelt placera fälten du vill behålla inom grupperingen _id
. Sedan kan du omforma med $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 andra "tricket" där är att använda ett tillfälligt namn för arrayen i grupperingsstadiet. Detta är så när du $projekt
och ändra namnet får du fälten i den ordning som anges i projektionssatsen. Om du inte gjorde det skulle fältet "array_to_sort" inte vara det sista fältet i ordningen, eftersom det är kopierat från föregående steg.
Det är en avsedd optimering i $project
, men om du vill ha beställningen kan du göra det som ovan.
För helt okända strukturer finns mapReduce sättet att göra saker 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 naturligtvis ett utdataformat som är specifikt för mapReduce och därför inte exakt det dokument du hade, men alla fält finns under "värden":
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 0,
"some_field" : "a",
"array_to_sort" : [
{
"a" : 1,
"b" : 0
},
{
"a" : 3,
"b" : 3
},
{
"a" : 3,
"b" : 4
}
]
}
}
],
}
Framtida utgåvor ( i skrivande stund ) tillåter dig att använda en $$ROOT
variabel för att representera 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 är ingen idé att använda det sista "projekt"-stadiet eftersom du faktiskt inte känner till de andra fälten i dokumentet. Men de kommer alla att finnas (inklusive den ursprungliga arrayen och ordningen ) inom _id
fältet i resultatdokumentet.