Du kan inte göra det med arrayer, och huvudproblemet här är för att du vill att "sorteringen" ska ske på det matchade elementet. Om du vill sortera resultat så här måste du använda .aggregate()
istället. Antingen som:
För moderna MongoDB-versioner:
db.maps.aggregate([
{ "$match": { "points.type": "type1" }},
{ "$addFields": {
"order": {
"$filter": {
"input": "$points",
"as": "p",
"cond": { "$eq": [ "$$p.type", "type1" ] }
}
}
}},
{ "$sort": { "order": 1 } }
])
För MongoDB 2.6 till 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 } },
]);
Eller mindre effektivt i versioner före 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 } }
])
Det är det enda sättet att matcha de korrekta elementen och få dem övervägda i en "sorteringsoperation". Standardmarkörsorteringen kommer bara annars att beakta värdena för fältet i arrayelementen som inte matchar din valda "typ" istället.