आप इसे सरणी के साथ नहीं कर सकते हैं, और यहां मुख्य समस्या यह है कि आप मिलान किए गए तत्व पर "सॉर्ट" करना चाहते हैं। यदि आप इस तरह के परिणामों को क्रमबद्ध करना चाहते हैं तो आपको .aggregate()
. का उपयोग करना होगा बजाय। या तो इस रूप में:
आधुनिक MongoDB संस्करणों के लिए:
db.maps.aggregate([
{ "$match": { "points.type": "type1" }},
{ "$addFields": {
"order": {
"$filter": {
"input": "$points",
"as": "p",
"cond": { "$eq": [ "$$p.type", "type1" ] }
}
}
}},
{ "$sort": { "order": 1 } }
])
MongoDB 2.6 से 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 } },
]);
या 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 } }
])
सही तत्वों से मेल खाने का यही एकमात्र तरीका है और उन्हें "सॉर्ट" ऑपरेशन में माना जाता है। डिफ़ॉल्ट कर्सर सॉर्ट अन्यथा सरणी तत्वों में फ़ील्ड के मानों पर विचार करेगा जो इसके बजाय आपके चयनित "प्रकार" से मेल नहीं खाते।