Anda tidak dapat melakukannya dengan array, dan masalah utama di sini adalah karena Anda ingin "sort" terjadi pada elemen yang cocok. Jika Anda ingin mengurutkan hasil seperti ini maka Anda perlu menggunakan .aggregate()
sebagai gantinya. Baik sebagai:
Untuk versi MongoDB modern:
db.maps.aggregate([
{ "$match": { "points.type": "type1" }},
{ "$addFields": {
"order": {
"$filter": {
"input": "$points",
"as": "p",
"cond": { "$eq": [ "$$p.type", "type1" ] }
}
}
}},
{ "$sort": { "order": 1 } }
])
Untuk MongoDB 2.6 hingga 3.0
db.maps.aggregate([
{ $match: { 'points.type': 'type1' } },
{
$project: {
points: {
$setDifference: [
{
$map: {
input: '$points',
as: 'p',
in: {
$cond: [
{ $eq: ['$$p.type', 'type1'] },
'$$p',
false,
]
}
}
},
[false]
]
}
}
},
{ $sort: { 'points.distanceToSpawn': 1 } },
]);
Atau kurang efisien dalam versi sebelum MongoDB 2.6:
db.maps.aggregate([
{ "$match": { "points.type": "type1" }},
{ "$unwind": "$points" },
{ "$match": { "points.type": "type1" }},
{ "$group": {
"_id": "$_id",
"points": { "$push": "$points" }
}},
{ "$sort": { "points.ditanceToSpawn": 1 } }
])
Itulah satu-satunya cara untuk mencocokkan elemen yang benar dan mempertimbangkannya dalam operasi "sortir". Pengurutan kursor default hanya akan mempertimbangkan nilai untuk bidang dalam elemen larik yang tidak cocok dengan "tipe" yang Anda pilih.