MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

दूरी के अनुसार क्रमबद्ध मोंगोडब में लाइनस्ट्रिंग के पास अंक खोजें

जैसा कि आपने उल्लेख किया है, Mongo वर्तमान में Point . के अलावा किसी अन्य चीज़ का समर्थन नहीं करता है . क्या आप रूट बॉक्सर की अवधारणा के बारे में जानते हैं? 1 यह कुछ साल पहले गूगल मैप्स पर बहुत लोकप्रिय था। आपके द्वारा खींची गई रेखा को देखते हुए, ऐसे स्टॉप खोजें जो dist(x) . के भीतर हों . यह लाइन में प्रत्येक बिंदु के चारों ओर बाउंडिंग बॉक्स की एक श्रृंखला बनाकर और बकेट के भीतर आने वाले बिंदुओं की खोज करके किया गया था।

मैं आपके प्रश्न पर तब अड़ गया जब मुझे एहसास हुआ कि मोंगो केवल अंकों के साथ काम करता है, जो कि उचित है मुझे लगता है।

मेरे पास पहले से ही कुछ विकल्प हैं कि इसे कैसे करें (वे टिप्पणी में @mnemosyn क्या कहते हैं, इस पर विस्तार करते हैं)। जिस डेटासेट पर मैं काम कर रहा हूं, वह क्लाइंट-साइड पर है, इसलिए मैं रूटबॉक्सर का उपयोग कर सकता हूं, लेकिन मैं इसे प्रदर्शन कारणों से सर्वर-साइड लागू करना चाहता हूं। ये रहे मेरे सुझाव:

  1. LineString को तोड़ें इसके अलग-अलग निर्देशांक सेट में, और $near . के लिए क्वेरी करें उनमें से प्रत्येक का उपयोग करके, परिणामों को संयोजित करें और एक अद्वितीय सेट निकालें। अंकों की संख्या को कम करके एक जटिल रेखा को सरल बनाने के लिए एल्गोरिदम हैं, लेकिन एक सरल लिखना आसान है।

  2. ऊपर जैसा ही करें, लेकिन एक संग्रहीत प्रक्रिया/फ़ंक्शन के रूप में। मैंने मोंगो के संग्रहीत कार्यों के साथ नहीं खेला है, और मुझे नहीं पता कि वे ड्राइवरों के साथ कितनी अच्छी तरह काम करते हैं, लेकिन यह ऊपर दिए गए पहले विकल्प से तेज़ हो सकता है क्योंकि आपको राउंडट्रिप नहीं करना पड़ेगा, और मशीन के आधार पर Mongo का आपका इंस्टेंस (इंस्टेंस) होस्ट किया गया है (हैं), गणना माइक्रोसेकंड द्वारा तेज़ हो सकती है।

  3. रूटबॉक्सर दृष्टिकोण सर्वर-साइड (PHP में किया गया है) को लागू करें, और फिर उपरोक्त 2 में से किसी एक का उपयोग स्टॉप खोजने के लिए करें जो $within हैं परिणामी बाउंडिंग बॉक्स। हेक चूंकि रूटबॉक्सर विधि आयत लौटाती है, इसलिए इन सभी आयतों को आपके मार्ग को कवर करने वाले एक बहुभुज में विलय करना संभव होगा, और बस एक $within करें उस पर। (क्या @mnemosyn ने सुझाव दिया)।

  4. संपादित करें: मैंने इसके बारे में सोचा था, लेकिन इसके बारे में भूल गया था, लेकिन एकत्रीकरण ढांचे का उपयोग करके उपरोक्त में से कुछ को प्राप्त करना संभव हो सकता है।

यह कुछ ऐसा है जिस पर मैं जल्द ही काम करने जा रहा हूं (उम्मीद है), मैं अपने परिणामों को ओपन-सोर्स करूंगा जिसके आधार पर मैं अंत में जा रहा हूं।

संपादित करें: मुझे यह उल्लेख करना चाहिए कि 1 और 2 में यह दोष है कि यदि आपके पास एक पंक्ति में 2 बिंदु हैं जो 2 किमी अलग हैं, और आप ऐसे बिंदु चाहते हैं जो आपकी रेखा के 1.8 किमी के भीतर हों, तो आप स्पष्ट रूप से उस हिस्से के बीच के सभी बिंदुओं को याद करेंगे आपकी लाइन का। समाधान यह है कि इसे सरल करते समय अपनी लाइन पर अंक इंजेक्ट करें (मुझे पता है, नए लोगों को वापस जोड़ने पर अंक कम करने के उद्देश्य को हरा देता है)।

3 के साथ दोष यह है कि यह हमेशा सटीक नहीं होगा क्योंकि आपके बहुभुज के कुछ बिंदुओं की दूरी आपकी सीमा से अधिक होने की संभावना है, हालांकि अंतर आपकी सीमा का एक महत्वपूर्ण प्रतिशत नहीं होगा।

[1 ] गूगल मैप्स यूटिल्स रूटबॉक्सर



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. oplog.rs में ts फ़ील्ड पर अनुक्रमणिका अद्यतन नहीं है

  2. MongoError:संग्रह छोड़ने का प्रयास करते समय एनएस नहीं मिला

  3. मैं MongoDB में ब्लॉब डेटा कैसे स्टोर करूं?

  4. Nodejs + Mongo db उपयोगकर्ता नाम और पासवर्ड के साथ सर्वर डेटाबेस से जुड़ते हैं

  5. MongoDB अब खाली दस्तावेज़ के साथ $set और $unset का उपयोग करने की अनुमति क्यों नहीं देता है?