आप इसे इस तरह से बिल्कुल नहीं कर सकते हैं - सामान्य तौर पर आप संग्रह में मूल्यों पर अपने MongoDB प्रश्नों में कुछ भी आधार नहीं बना सकते हैं।
हालाँकि, MongoDB 2.4 के बाद से हम 2dsphere
. नामक एक नई अनुक्रमणिका का समर्थन करते हैं जो आपको न केवल डेटाबेस में अंक, बल्कि पॉलीगॉन को भी स्टोर करने की अनुमति देता है। आप उस जानकारी को एक दस्तावेज़ में संग्रहीत करेंगे जैसे:
db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
} );
और फिर आप यह पता लगाने के लिए "प्रतिच्छेदन" क्वेरी का उपयोग कर सकते हैं कि क्या कोई बिंदु प्रत्येक बहुभुज द्वारा कवर किया गया है:
db.so.find( {
'loc' : {
$geoIntersects: {
$geometry: { type: 'Point', coordinates: [ 0, 0 ] }
}
}
} );
जो फिर लौटता है:
{
"_id" : ObjectId("51f24d566775068ab0b786f0"),
"name" : "Firestation 1",
"loc" : {
"type" : "Polygon",
"coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
}
यहां उसे फायर स्टेशन मिलता है, क्योंकि 0, 0 बहुभुज के बीच में है। अब चाल निश्चित रूप से बहुभुज बिंदुओं की गणना करने के लिए है जो केंद्र बिंदु से "त्रिज्या" (10 किमी) दूर एक सर्कल बनाते हैं। आप एक वास्तविक वृत्त प्राप्त करने में सक्षम नहीं होंगे, लेकिन एक षट्भुज या अष्टकोण पर्याप्त होना चाहिए। इसके लिए गणित बहुत आसान नहीं है, लेकिन http:// www.movable-type.co.uk/scripts/latlong.html#destPoint जावास्क्रिप्ट में एक उदाहरण है। सर्कल की परिधि के साथ बिंदुओं की गणना करने के लिए बस अपने असर को 0 से 2PI तक 8 चरणों में लूप करें, और उन्हें निर्देशांक में रखें। उन्हें डबल नेस्टेड एरे में एम्बेड करना सुनिश्चित करें और पहले और आखिरी को समान बनाएं:
{
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [
[ point1-lon, point1-lat ],
[ point2-lon, point2-lat ],
[ point3-lon, point3-lat ],
...
[ point1-lon, point1-lat ],
] ]
}
}