"geospatial query" के लिए मान्य होने के लिए "स्थान" देशांतर, अक्षांश . में होना चाहिए आदेश दें और इसमें कोई अन्य निर्देशांक शामिल नहीं हो सकते हैं।
मान्य प्रारूप हैं
{
"location": [long,lat]
}
या
{
"location": { "lng": long, "lat": lat }
}
या जियोसन
{
"location": {
"type": "Point",
"coordinates": [long,lat]
}
}
एक अन्य फ़ील्ड जैसे "त्रिज्या" "दूसरा क्षेत्र" है और नहीं एक ही सरणी का हिस्सा बनें।
आदर्श रूप से जियोसन का अनुसरण करें:
{
"location": {
"type": "Point",
"coordinates": [long,lat]
},
"radius": radius
}
नेवला स्कीमा परिभाषा में कौन सा सरल हो सकता है:
var geoSchema = new Schema({
"location": {
"type": String,
"coordinates": []
},
"radius": Number
});
वास्तविक "ग्लोब" निर्देशांक पर भू-स्थानिक डेटा के साथ काम करते समय आपका सूचकांक "2dsphere"होना चाहिए। ए> , जिसे आप वैकल्पिक रूप से स्कीमा पर इस प्रकार परिभाषित करते हैं:
geoSchema.index({ "location": "2dsphere" })
चूंकि समर्थित GeoJSON में "सर्कल" ऑब्जेक्ट के लिए कोई वास्तविक समर्थन नहीं है, इसलिए किसी अन्य फ़ील्ड को "त्रिज्या" के रूप में रखने और "केंद्र बिंदु" को संग्रहीत करने की अनुशंसा की जाती है।
अन्य "विरासत समन्वय जोड़े" प्रारूपों पर जियोसन के साथ "बड़ा" लाभ यह है कि geoNear
या $geoNear
तो उस "दूरी" को लगातार "मीटर" में परिभाषित किया जाता है। परिणाम के अनुरूप बने रहने के लिए आपको अपने संग्रहण में किसी भी "त्रिज्या" मान को इस प्रकार परिभाषित करना चाहिए।
अन्य भंडारण प्रारूपों के साथ, परिणाम "रेडियन" में वापस आ जाता है, जिसके लिए आप शायद कनवर्ट करना चाहते हैं और माप के रूप में एक सर्कल के "त्रिज्या" को संग्रहित नहीं करना पसंद करेंगे।
आप जिस तरह से इससे निपटते हैं, वह इस रूप में डेटा पर विचार कर रहा है:
{
"locationtype": "circle",
"location": {
"type": "Point",
"coordinates": [1,1]
},
"radius": 4
}
फिर आप .aggregate()
का इस्तेमाल करते हैं
एक $geoNear
के साथ
चरण और एक $redact
फ़िल्टर करने के लिए:
db.collection.aggregate([
// Find points or objects "near" and project the distance
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [2,2]
},
"distanceField": "distance",
"query": { "locationType": "circle" }
}},
// Logically filter anything outside of the radius
{ "$redact": {
"$cond": {
"if": { "$gt": [ "$distance", "$radius" ] },
"then": "$$PRUNE",
"else": "$$KEEP"
}
}}
])
अब क्वेरी उदाहरण में उपयोग किए गए मान केवल एक उदाहरण हैं, लेकिन जैसा कि "वास्तविक" देशांतर और अक्षांश निर्देशांक के साथ कहा गया है, "दूरी" विशेषताएँ डिज़ाइन के अनुसार और "मीटर" सहिष्णुता के भीतर काम करती हैं जैसा कि पहले उल्लेख किया गया है।
यहाँ बिंदु ये हैं कि $geoNear
दोनों को "सर्कल" केंद्र बिंदु पर "निकट" मिलेगा, इससे कोई फर्क नहीं पड़ता कि वस्तु का प्रकार क्या है। इतना ही नहीं बल्कि यहाँ कमांड दस्तावेज़ में किसी अन्य फ़ील्ड का "प्रक्षेपण" उत्पन्न कर रहा है जैसा कि "डिस्टेंसफ़ील्ड" में नाम दिया गया है। यह "मीटर" में वृत्त "केंद्र" से दूरी का प्रतिनिधित्व करता है।
यहां दूसरा चरण $redact
. का उपयोग करता है चूंकि यह एक तरह से $project<जैसा है /कोड>
और $match
एक में पाइपलाइन चरण। $मिलान
के विपरीत यह ऑपरेटर दस्तावेज़ में मौजूद फ़ील्ड की तुलना करके "तार्किक" स्थिति का मूल्यांकन कर सकता है। इस मामले में, ऑपरेशन जैसे $$ PRUNE
मिलान किए गए दस्तावेज़ को "if" स्थिति में निकालें जहां true
और इसे परिणामों से या अन्यथा "हटाएं" $$रखें
दस्तावेज़ जहाँ शर्त गलत
थी ।
एक "संक्षेप" में, यदि "दूरी" "से अधिक" है तो "वृत्त" की "त्रिज्या" है तो वस्तु वृत्त के "बाहर" स्थित है और "प्रतिच्छेद" नहीं करती है। अन्यथा "यह करता है"।
तो यह एक संग्रह में ज्यामिति के लिए "एक 'सर्कल' को परिभाषित करने और "सर्कल" त्रिज्या के भीतर "बिंदु" या अन्य प्रकार की वस्तु के बीच चौराहे जैसा कुछ हासिल करने के लिए "इसका उपयोग" करने की मूल बातें है।