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

$निकट के साथ दस्तावेज़ में संग्रहीत दूरी के अनुसार दस्तावेज़ फ़िल्टर करें

यह मानते हुए कि आपने पहले ही ईवेंट डेटा पर कार्रवाई करने के लिए काम कर लिया है क्योंकि आप इसे प्राप्त करते हैं और इसे हाथ में रखते हैं (यदि आपके पास नहीं है, तो यह एक और सवाल है, लेकिन टेलेबल कर्सर्स ), तो आपके पास उस डेटा के साथ एक ऑब्जेक्ट होना चाहिए जिसके साथ उपयोगकर्ताओं से पूछताछ की जा सके।

इसलिए यह $where<के साथ JavaScript मूल्यांकन का मामला नहीं है /कोड> , क्योंकि यह $near से लौटाए गए क्वेरी डेटा तक नहीं पहुंच सकता वैसे भी ऑपरेशन। इसके बजाय आप जो चाहते हैं वह है $geoNear एकत्रीकरण ढांचे से। यह क्वेरी से मिली "दूरी" को प्रोजेक्ट कर सकता है, और बाद के चरण को उपयोगकर्ता द्वारा संग्रहीत मूल्य के विरुद्ध परिणामों को "फ़िल्टर" करने की अनुमति देता है, अधिकतम दूरी के लिए वे प्रकाशित घटनाओं की यात्रा करना चाहते हैं:

// Represent retrieved event data
var eventData = {
  eventLocation: {
    latlong: [long,lat]
  }
};

// Find users near that event within their stored distance
User.aggregate(
  [
    { "$geoNear": {
      "near": {
        "type": "Point",
        "coordinates": eventData.eventLocation.latlong
      },
      "distanceField": "eventDistance",
      "limit": 100000,
      "spherical": true
    }},
    { "$redact": {
      "$cond": {
        "if": { "$lt": [ "$eventDistance", "$maxDistance" ] },
        "then": "$$KEEP",
        "else": "$$PRUNE"
      }
    }}
  ]
  function(err,results) {
    // Work with results in here
  }
)

अब आपको लौटाई गई संख्या से सावधान रहने की आवश्यकता है, क्योंकि चूंकि आप जियोसन के बजाय "विरासत समन्वय जोड़े" में संग्रहीत करते दिखाई देते हैं, तो इस ऑपरेशन से लौटाई गई दूरी रेडियन में होगी और मानक दूरी नहीं होगी। तो मान लें कि आप उपयोगकर्ता वस्तुओं पर "मील" या "किलोमीटर" में संग्रहीत कर रहे हैं तो आपको मैनुअल में उल्लिखित सूत्र के माध्यम से गणना करने की आवश्यकता है "गोलाकार ज्यामिति का उपयोग करके दूरियों की गणना करें" जैसा कि मैनुअल में बताया गया है।

मूल बातें यह हैं कि आपको पृथ्वी के भूमध्यरेखीय त्रिज्या से विभाजित करने की आवश्यकता है, या तो 3,963.2 मील या 6,378.1 किलोमीटर की दूरी पर, जो आपने संग्रहीत किया है उसकी तुलना में परिवर्तित करने के लिए।

वैकल्पिक रूप से जियोसन में स्टोर करना है, जहां मीटर में एक समान माप होता है।

"किलोमीटर" मानते हुए कि "if" लाइन बन जाती है:

"if": { "$lt": [
    "$eventDistance",
    { "$divide": [ "$maxDistance", 6,378.1 ] }
 ]},

अपने संग्रहीत किलोमीटर मान की तुलना रेडियन परिणाम से विश्वसनीय रूप से करने के लिए।

दूसरी बात जो आपको जाननी चाहिए वह यह है कि $geoNear 100 परिणामों की एक डिफ़ॉल्ट "सीमा" है, इसलिए आपको संभावित उपयोगकर्ताओं से मेल खाने के लिए अपेक्षित संख्या के लिए "सीमा" तर्क को "पंप" करने की आवश्यकता है। आप इसे वास्तव में एक बड़ी प्रणाली के लिए उपयोगकर्ता आईडी की "श्रेणी सूचियों" में भी करना चाह सकते हैं, लेकिन आप एक एकल एकत्रीकरण ऑपरेशन के भीतर जितनी बड़ी मेमोरी की अनुमति देते हैं, उतना बड़ा जा सकते हैं और संभवतः जोड़ सकते हैं allowDiskUse जहां जरूरत हो।

यदि आप उस पैरामीटर को ट्यून नहीं करते हैं, तो केवल निकटतम 100 परिणाम (डिफ़ॉल्ट) लौटाए जाएंगे, जो कि शुरू होने वाले ईवेंट के "निकट" को फ़िल्टर करने के आपके अगले ऑपरेशन के अनुरूप भी नहीं हो सकते हैं। हालांकि सामान्य ज्ञान का उपयोग करें, क्योंकि निश्चित रूप से आपके पास संभावित उपयोगकर्ताओं को फ़िल्टर करने के लिए अधिकतम दूरी है, और इसे क्वेरी में भी जोड़ा जा सकता है।

जैसा कि कहा गया है, यहां बिंदु तुलना के लिए दूरी लौटा रहा है, इसलिए अगला चरण है $react ऑपरेशन जो घटना से लौटाई गई दूरी के मुकाबले उपयोगकर्ता की अपनी "यात्रा दूरी" मान को फिट कर सकता है। अंतिम परिणाम केवल उन उपयोगकर्ताओं को देता है जो घटना से अपनी दूरी की सीमा के भीतर आते हैं जो अधिसूचना के लिए अर्हता प्राप्त करेंगे।

यही तर्क है। आप उपयोगकर्ता से घटना की दूरी को प्रोजेक्ट करते हैं और फिर उपयोगकर्ता द्वारा संग्रहीत मूल्य की तुलना करते हैं कि वे किस दूरी की यात्रा के लिए तैयार हैं। कोई जावास्क्रिप्ट नहीं, और सभी देशी ऑपरेटर जो इसे काफी तेज बनाते हैं।

जैसा कि विकल्पों और सामान्य टिप्पणी में उल्लेख किया गया है, मैं वास्तव में सुझाव देता हूं कि आप सटीक गोलाकार दूरी की गणना के लिए "2dsphere" इंडेक्स का उपयोग करें और साथ ही अपने डेटाबेस ऑब्जेक्ट्स में अपने समन्वय भंडारण के लिए GeoJSON स्टोरेज में कनवर्ट करें, क्योंकि वे दोनों सामान्य मानक हैं। लगातार परिणाम देते हैं।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB ClusterControl 1.4 . में सुविधाएँ

  2. मोंगोडब में अपवोट/डाउनवोट संग्रहित करना

  3. ClusterControl 1.6 . के साथ क्लाउड डेटाबेस परिनियोजित करना

  4. मोंगो उन दस्तावेजों को ढूंढता है जहां सरणी में दिए गए सरणी के x मान होते हैं

  5. एम्बेडेड सरणी के आधार पर दस्तावेज़ों को कैसे फ़िल्टर करें?