Тъй като групирате в документа _id
можете просто да поставите полетата, които искате да запазите, в групата _id
. След това можете да оформите отново, като използвате $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"
}}
]);
Другият "трик" там е използването на временно име за масива в етапа на групиране. Това е така, когато $project
и промените името, получавате полетата в реда, посочен в изявлението за проекция. Ако не сте го направили, полето "array_to_sort" няма да е последното поле в реда, тъй като е копирано от предишния етап.
Това е предвидена оптимизация в $projectкод>
, но ако искате реда, можете да го направите както по-горе.
За напълно непознати структури съществува начинът mapReduce за правене на нещата:
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 } }
)
Разбира се, това има изходен формат, който е специфичен за mapReduce и следователно не е точно документът, който сте имали, но всички полета се съдържат под „стойности“:
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 0,
"some_field" : "a",
"array_to_sort" : [
{
"a" : 1,
"b" : 0
},
{
"a" : 3,
"b" : 3
},
{
"a" : 3,
"b" : 4
}
]
}
}
],
}
Бъдещите издания ( към момента на писане ) ви позволяват да използвате $$ROOT
променлива в агрегат за представяне на документа:
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"}
}}
]);
Така че няма смисъл да използвате последния етап "проект", тъй като всъщност не знаете другите полета в документа. Но всички те ще се съдържат (включително оригиналния масив и ред) в _id
поле на документа с резултата.