Karena Anda mengelompokkan dokumen _id
Anda cukup menempatkan bidang yang ingin Anda simpan dalam pengelompokan _id
. Kemudian Anda dapat membentuk ulang menggunakan $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"
}}
]);
"Trik" lain di sana adalah menggunakan nama sementara untuk array di tahap pengelompokan. Ini terjadi ketika Anda $project
dan ubah namanya, Anda mendapatkan bidang dalam urutan yang ditentukan dalam pernyataan proyeksi. Jika tidak, kolom "array_to_sort" tidak akan menjadi kolom terakhir dalam urutan, karena kolom tersebut disalin dari tahap sebelumnya.
Itu adalah pengoptimalan yang dimaksudkan di $project
, tapi kalau mau order bisa seperti di atas.
Untuk struktur yang sama sekali tidak diketahui, ada cara mapReduce untuk melakukan sesuatu:
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 } }
)
Tentu saja itu memiliki format keluaran yang khusus untuk mapReduce dan oleh karena itu bukan dokumen yang Anda miliki, tetapi semua bidang terdapat di bawah "nilai":
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 0,
"some_field" : "a",
"array_to_sort" : [
{
"a" : 1,
"b" : 0
},
{
"a" : 3,
"b" : 3
},
{
"a" : 3,
"b" : 4
}
]
}
}
],
}
Rilis mendatang ( pada saat penulisan ) memungkinkan Anda untuk menggunakan $$ROOT
variabel secara agregat untuk mewakili dokumen:
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"}
}}
]);
Jadi tidak ada gunanya menggunakan tahap "proyek" terakhir karena Anda sebenarnya tidak mengetahui bidang lain dalam dokumen. Tapi semuanya akan ditampung (termasuk array asli dan order ) di dalam _id
bidang dokumen hasil.