Du kan ikke gøre det med arrays, og hovedproblemet her er, fordi du ønsker, at "sorteringen" skal ske på det matchede element. Hvis du vil sortere resultater som dette, skal du bruge .aggregate()
i stedet. Enten som:
For moderne MongoDB-versioner:
db.maps.aggregate([
{ "$match": { "points.type": "type1" }},
{ "$addFields": {
"order": {
"$filter": {
"input": "$points",
"as": "p",
"cond": { "$eq": [ "$$p.type", "type1" ] }
}
}
}},
{ "$sort": { "order": 1 } }
])
Til MongoDB 2.6 til 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ør 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 er den eneste måde at matche de korrekte elementer og få dem overvejet i en "sorterings"-operation. Standardmarkørens sortering vil bare ellers overveje værdierne for feltet i array-elementerne, der ikke matcher din valgte "type" i stedet for.