Protože seskupujete na dokumentu _id
můžete jednoduše umístit pole, která chcete zachovat, do seskupení _id
. Poté můžete formulář znovu vytvořit pomocí $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"
}}
]);
Dalším „trikem“ je použití dočasného názvu pole ve fázi seskupování. Je tomu tak, když $project
a změňte název, získáte pole v pořadí uvedeném v příkazu projekce. Pokud byste tak neučinili, pole „array_to_sort“ by nebylo posledním polem v objednávce, protože je zkopírováno z předchozí fáze.
To je zamýšlená optimalizace v $project
, ale pokud chcete objednávku, můžete to udělat tak, jak je uvedeno výše.
Pro zcela neznámé struktury existuje způsob, jak věci dělat 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 } }
)
To má samozřejmě výstupní formát, který je specifický pro mapReduce, a tedy ne přesně ten dokument, který jste měli, ale všechna pole jsou obsažena pod "hodnotami":
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 0,
"some_field" : "a",
"array_to_sort" : [
{
"a" : 1,
"b" : 0
},
{
"a" : 3,
"b" : 3
},
{
"a" : 3,
"b" : 4
}
]
}
}
],
}
Budoucí vydání (v době psaní) vám umožní používat $$ROOT
proměnná v agregaci reprezentující dokument:
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"}
}}
]);
Nemá tedy smysl používat závěrečnou fázi „projektu“, protože ve skutečnosti neznáte ostatní pole v dokumentu. Ale všechny budou obsaženy (včetně původního pole a pořadí) v _id
pole výsledného dokumentu.