जियोस्पेशल क्वेरी का इस्तेमाल करना

किसी खास अक्षांश और देशांतर से तय दूरी के अंदर मौजूद दस्तावेज़ों के बारे में क्वेरी करने के लिए, MongoDB के साथ काम करने वाली कार्रवाइयों में जियोस्पेशल क्वेरी का इस्तेमाल करें.

शुरू करने से पहले

  1. पक्का करें कि आपके पास MongoDB के साथ काम करने वाली कार्रवाइयों का कोई मौजूदा डेटाबेस हो . इसके अलावा , कोई डेटाबेस बनाएं और उससे कनेक्ट करें.

  2. पक्का करें कि आपके पास कम से कम एक 2dsphere इंडेक्स हो. इसके अलावा, कोई 2dsphere इंडेक्स बनाएं.

GeoJSON ऑब्जेक्ट

अपने कलेक्शन में मौजूद फ़ील्ड के ख़िलाफ़ जियोस्पेशल क्वेरी चलाने के लिए, क्वेरी किए जाने वाले फ़ील्ड GeoJSON ऑब्जेक्ट या GeoPoint होने चाहिए.

$near ऑपरेटर का इस्तेमाल करके, जियोस्पेशल क्वेरी की जा सकती है. यह ऑपरेटर, दस्तावेज़ों में मौजूद जियो पॉइंट के मुकाबले, किसी जियो पॉइंट की दूरी का हिसाब लगाता है. इसके बाद, क्वेरी के नतीजों में इन दस्तावेज़ों को सबसे पास से सबसे दूर की दूरी के हिसाब से क्रम में लगाया जाता है. क्वेरी में $natural के अलावा, दूसरा सॉर्ट ऑर्डर तय करके भी इस सॉर्ट ऑर्डर को बदला जा सकता है. क्वेरी फ़िल्टर में, किसी दस्तावेज़ के फ़ील्ड में $near ऑपरेटर मौजूद होना चाहिए. साथ ही, इसमें $geometry GeoJSON फ़ील्ड होना चाहिए.

यहां दिए गए उदाहरण में, $near ऑपरेटर का इस्तेमाल करके, जियो पॉइंट (-122.084, 37.4221) और myCollection. में मौजूद सभी दस्तावेज़ों के location फ़ील्ड में मौजूद जियो पॉइंट के बीच की दूरी का हिसाब लगाया गया है. दस्तावेज़ों को वापस किया जाता है और दोनों पॉइंट के बीच की दूरी के हिसाब से, सबसे पास से सबसे दूर के क्रम में लगाया जाता है.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

क्वेरी के पॉइंट से मीटर में दूरी को कंट्रोल करने के लिए, वैकल्पिक $maxDistance और $minDistance फ़ील्ड का भी इस्तेमाल किया जा सकता है. यहां दिए गए उदाहरण में, एक क्वेरी दिखाई गई है. इसमें वापस किए गए दस्तावेज़, पॉइंट (-122.084, 37.4221) से कम से कम 500 मीटर और ज़्यादा से ज़्यादा 2,000 मीटर की दूरी पर होने चाहिए:

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

अगर आपका इंडेक्स बांटा गया है, तो क्वेरी में "and" समानता फ़िल्टर में पार्टीशन शामिल करके, पार्टीशन के आधार पर फ़िल्टर किया जा सकता है. उदाहरण के लिए, अगर आपके पास region पार्टीशन है और आपको midwest इलाके के हिसाब से क्वेरी के नतीजों को फ़िल्टर करना है, तो यह तरीका अपनाएं:

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

आपके पार्टीशन की वैल्यू, एक स्ट्रिंग होनी चाहिए. आपके पार्टीशन फ़िल्टर को, $and ऑपरेटर की मदद से, खोज क्वेरी से जोड़ा जाना चाहिए.

सीमाएं

  • एक ही क्वेरी में, $near ऑपरेटर और $text ऑपरेटर का इस्तेमाल नहीं किया जा सकता.
  • मल्टी-क्लॉज़ $or स्टेटमेंट में, $near को नेस्ट नहीं किया जा सकता. हालांकि, $or क्लॉज़ में सिर्फ़ $near एक्सप्रेशन होने पर, इसे नेस्ट किया जा सकता है.
  • किसी क्वेरी में, $near का इस्तेमाल $not या $nor ऑपरेटर के साथ नहीं किया जा सकता.
  • $near को एग्रीगेशन क्वेरी में इस्तेमाल नहीं किया जा सकता.