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

एक संग्रहीत मंडली के भीतर एक स्थान खोजें

मूल से भी अधिक इष्टतम, अब आप $expr एक $match के अंदर प्रारंभिक $geoNear के बाद का चरण :

db.collection.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},
    { "$match": { "$expr": { "$lte": [ "$distance", "$radius" ] } }}
])

वास्तव में पहली बार लिखे जाने की तुलना में थोड़ा अधिक इष्टतम। अब हम केवल $redact कर सकते हैं के बजाय $project बूलियन और $match बाद में:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius and remove if not
    { "$redact": {
        "$cond": {
            "if": { "$lte": [ "$distance", "$radius" ] },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

आपने जानकारी को ठीक उसी तरह संग्रहीत किया है जैसा आपको करना चाहिए, लेकिन परिणाम प्राप्त करने के लिए आपके विचार से अलग दृष्टिकोण है।

आप जो उपयोग करना चाहते हैं वह है $geoNear और विशेष रूप से एकत्रीकरण ढांचा उस ऑपरेटर का रूप। यहाँ आप क्या करते हैं:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius
    { "$project": {
        "location": 1,
        "radius": 1,
        "distance": 1,
        "within": { "$lte": [ "$distance", "$radius" ] }
    }},

    // Match only documents within the radius
    { "$match": { "within": true } }
])

ताकि फ़ॉर्म क्वेरी किए गए बिंदु से दूरी को परिणामों में "अनुमानित" करने की अनुमति देता है, जबकि क्वेरी भी केवल निकटतम दस्तावेज़ लौटाएगी।

फिर आप यह देखने के लिए तार्किक तुलना का उपयोग करते हैं कि "दूरी" मान "त्रिज्या" से कम है, इसलिए सर्कल के भीतर।

अंत में आप केवल उन परिणामों को फ़िल्टर करने के लिए मेल खाते हैं जहां "भीतर" दावा सत्य था।

आप $geoNear . में अन्य विकल्प जोड़ सकते हैं जैसा कि दस्तावेज़ीकरण में दिखाया गया है। मैं यह भी दृढ़ता से सुझाव दूंगा कि आपके भंडारण को जियोसन प्रारूप का भी उपयोग करना चाहिए क्योंकि यह उन अन्य पुस्तकालयों के लिए अधिक अनुकूल होने की संभावना है जो आप प्राप्त परिणामों पर काम करने के लिए उपयोग कर सकते हैं।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $गिनती एकत्रीकरण ऑपरेटर

  2. Node.js - Mongoose . का उपयोग करके डेटा बनाएं, पढ़ें, अपडेट करें, हटाएं

  3. मोंगो के बिना उल्का

  4. जावा मोंगोडीबी ड्राइवर का उपयोग करके रेगेक्स और जटिल मानदंडों के साथ कोड संग्रह कैसे ढूंढें?

  5. SQL में किसी दिनांक से दिन, महीना और वर्ष कैसे प्राप्त करें?