मूल से भी अधिक इष्टतम, अब आप $expr
एक $match
के अंदर
प्रारंभिक $geoNear
के बाद का चरण
:
db.collection.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
{ "$match": { "$expr": { "$lte": [ "$distance", "$radius" ] } }}
])
वास्तव में पहली बार लिखे जाने की तुलना में थोड़ा अधिक इष्टतम। अब हम केवल $redact
कर सकते हैं
के बजाय $project
बूलियन और $match
बाद में:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius and remove if not
{ "$redact": {
"$cond": {
"if": { "$lte": [ "$distance", "$radius" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
आपने जानकारी को ठीक उसी तरह संग्रहीत किया है जैसा आपको करना चाहिए, लेकिन परिणाम प्राप्त करने के लिए आपके विचार से अलग दृष्टिकोण है।
आप जो उपयोग करना चाहते हैं वह है $geoNear
और विशेष रूप से एकत्रीकरण ढांचा
उस ऑपरेटर का रूप। यहाँ आप क्या करते हैं:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius
{ "$project": {
"location": 1,
"radius": 1,
"distance": 1,
"within": { "$lte": [ "$distance", "$radius" ] }
}},
// Match only documents within the radius
{ "$match": { "within": true } }
])
ताकि फ़ॉर्म क्वेरी किए गए बिंदु से दूरी को परिणामों में "अनुमानित" करने की अनुमति देता है, जबकि क्वेरी भी केवल निकटतम दस्तावेज़ लौटाएगी।
फिर आप यह देखने के लिए तार्किक तुलना का उपयोग करते हैं कि "दूरी" मान "त्रिज्या" से कम है, इसलिए सर्कल के भीतर।
अंत में आप केवल उन परिणामों को फ़िल्टर करने के लिए मेल खाते हैं जहां "भीतर" दावा सत्य था।
आप $geoNear
. में अन्य विकल्प जोड़ सकते हैं जैसा कि दस्तावेज़ीकरण में दिखाया गया है। मैं यह भी दृढ़ता से सुझाव दूंगा कि आपके भंडारण को जियोसन प्रारूप का भी उपयोग करना चाहिए क्योंकि यह उन अन्य पुस्तकालयों के लिए अधिक अनुकूल होने की संभावना है जो आप प्राप्त परिणामों पर काम करने के लिए उपयोग कर सकते हैं।