Bạn không thể làm điều đó với mảng và vấn đề chính ở đây là vì bạn muốn "sắp xếp" xảy ra trên phần tử đã so khớp. Nếu bạn muốn sắp xếp các kết quả như thế này thì bạn cần sử dụng .aggregate()
thay thế. Hoặc là:
Đối với các phiên bản MongoDB hiện đại:
db.maps.aggregate([
{ "$match": { "points.type": "type1" }},
{ "$addFields": {
"order": {
"$filter": {
"input": "$points",
"as": "p",
"cond": { "$eq": [ "$$p.type", "type1" ] }
}
}
}},
{ "$sort": { "order": 1 } }
])
Đối với MongoDB 2.6 đến 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 } },
]);
Hoặc kém hiệu quả hơn trong các phiên bản trước 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 } }
])
Đó là cách duy nhất để so khớp các phần tử chính xác và xem xét chúng trong một phép toán "sắp xếp". Thay vào đó, sắp xếp con trỏ mặc định sẽ xem xét các giá trị cho trường trong các phần tử mảng không khớp với "loại" đã chọn của bạn.