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

क्या भू-स्थानिक प्रश्न सरणियों पर काम करते हैं? ( $geoWithin , $geoIntersects )

यह उत्तर देने के लिए हां और ना में दोनों प्रश्नों में से एक है, क्योंकि हां में मिलान परिणामों के लिए एक सरणी समर्थित है, लेकिन शायद यह भी नहीं है कि आप वास्तव में मिलान कैसे किया जाता है, इस पर प्रतिबंधों पर विचार करना चाहते हैं।

आपको यहां जिस उल्लेखनीय परिवर्तन की आवश्यकता है, वह यह है कि वस्तुओं को स्वयं इस तरह से परिभाषित नहीं किया जाता है कि MongoDB उन्हें पहचानने जा रहा है जैसा कि आपने वर्तमान में बनाया है। दो इंडेक्स और सामान्य लुकअप फॉर्म या तो लीगेसी कोऑर्डिनेट पेयर (जो कि सिर्फ एक x,y पॉइंट है) या जियोजसन समर्थित GeoJSON ऑब्जेक्ट्स के साथ। आपकी समस्या यह है कि आपके पास एक "छद्म" जियोसन प्रारूप है जो वास्तव में कल्पना के अनुरूप नहीं है, और आप सीधे "निर्देशांक" तक पहुंचने का प्रयास कर रहे हैं, जहां आपको शीर्ष स्तर की वस्तु की आवश्यकता है:

{
    "regions": [
        {
            "name": "penta",
            "geometry": {
                "type": "Polygon",
                "coordinates": [[
                    [ 
                        -77.0322804898023610, 
                        -12.1271067552781560
                    ], 
                    [ 
                        -77.0336792618036270, 
                        -12.1255133434450870
                    ], 
                    [ 
                        -77.0326449349522590, 
                        -12.1239143495252150
                    ], 
                    [ 
                        -77.0300991833209990, 
                        -12.1238251884504540
                    ], 
                    [ 
                        -77.0299865305423740, 
                        -12.1262000752832540
                    ], 
                    [ 
                        -77.0322804898023610, 
                        -12.1271067552781560
                    ]
                ]]
            }
        },
        {
            "name": "triangle",
            "geometry": {
                "type": "Polygon",
                "coordinates": [[
                    [ 
                        -77.0313568040728570, 
                        -12.1266573492018090
                    ], 
                    [ 
                        -77.0325788855552670, 
                        -12.1246968022373030
                    ], 
                    [ 
                        -77.0300653204321860, 
                        -12.1246233756874440
                    ], 
                    [ 
                        -77.0313568040728570, 
                        -12.1266573492018090
                    ]
                ]]
            }
        }
    ]
}

ताकि जियोसन भाग को अच्छी तरह से गठित किया जा सके और अन्य मेटा डेटा से अलग किया जा सके जो कि कल्पना का हिस्सा नहीं है। आदर्श रूप से आप इंडेक्स भी करेंगे, हालांकि $geoWithin . के लिए जरूरी नहीं है या $geoIntersects यह निश्चित रूप से मदद करता है:

db.regions.createIndex({ "regions.geometry": "2dsphere" })

सरणी तत्व के भीतर GeoJSON परिभाषा के पूर्ण पथ को परिभाषित करना।

तब क्वेरी ठीक से काम करती हैं:

db.regions.find({
    "regions.geometry" : { 
        "$geoIntersects" : { 
            "$geometry" : { 
                "type" : "Polygon" , 
                "coordinates" : [[
                    [ -77.02877718955278 , -12.123750122669545],
                    [ -77.03457042574883 , -12.123750122669545],
                    [ -77.03457042574883 , -12.12736341792724],
                    [ -77.02877718955278 , -12.12736341792724], 
                    [ -77.02877718955278 , -12.123750122669545]
                ]]
            }
        }
    }
})

जो ऊपर दिए गए दस्तावेज़ से मेल खाता है। लेकिन निश्चित रूप से सरणी में कई वस्तुएं हैं, तो सवाल यह है कि इनमें से कौन मेल खाता है? जिसका कोई समर्थित उत्तर नहीं है, क्योंकि MongoDB "दस्तावेज़" से मेल खा रहा है और किसी भी तरह से यह संकेत नहीं दे रहा है कि किस सरणी तत्व का मिलान किया गया था।

एग्रीगेशन में एक विकल्प होता है $geoNear यह मिलान की गई वस्तु को वापस करने की अनुमति देता है, जहां इस मामले में यह "निकटतम" होगा। और उस तरह के विवरण के साथ उस जानकारी का उपयोग करना संभव है ताकि मिलान करने के लिए पूर्ण मेटा डेटा वाले सरणी तत्व में वह तत्व हो जो "निकटतम" के लिए पाया गया हो और उस डेटा को निकालें। लेकिन फिर से यह केवल "निकट" है और कभी भी एक सरणी से एक से अधिक परिणाम नहीं लौटा सकता है।

लेकिन आम तौर पर बोलना बेहतर होता है, लेकिन अलग-अलग ऑब्जेक्ट्स को अपने संग्रह में दस्तावेज़ के रूप में, जहां अलग-अलग ऑब्जेक्ट से मिलान दस्तावेज़ से मेल खाने का मामला है। तो अपने संग्रह में उपरोक्त सरणी के साथ, आप मिलान ज्यामिति के लिए केवल क्वेरी जारी करते हैं:

db.shapes.find({
    "geometry" : { 
        "$geoIntersects" : { 
            "$geometry" : { 
                "type" : "Polygon" , 
                "coordinates" : [ [ 
                    [ -77.02877718955278 , -12.123750122669545],
                    [ -77.03457042574883 , -12.123750122669545],
                    [ -77.03457042574883 , -12.12736341792724],
                    [ -77.02877718955278 , -12.12736341792724], 
                    [ -77.02877718955278 , -12.123750122669545]
                ]]
            }
        }
    }
})

जो सही वस्तु देता है क्योंकि इस मामले में आकृति दोनों को काटती है:

{
    "_id" : ObjectId("55f8d2fa66c2e7c750414b7a"),
    "name" : "penta",
    "geometry" : {
        "type" : "Polygon",
        "coordinates" : [[
            [
                    -77.03228048980236,
                    -12.127106755278156
            ],
            [
                    -77.03367926180363,
                    -12.125513343445087
            ],
            [
                    -77.03264493495226,
                    -12.123914349525215
            ],
            [
                    -77.030099183321,
                    -12.123825188450454
            ],
            [
                    -77.02998653054237,
                    -12.126200075283254
            ],
            [
                    -77.03228048980236,
                    -12.127106755278156
            ]
        ]]
    }
}
{
    "_id" : ObjectId("55f8d2fa66c2e7c750414b7b"),
    "name" : "triangle",
    "geometry" : {
        "type" : "Polygon",
        "coordinates" : [[
            [
                    -77.03135680407286,
                    -12.126657349201809
            ],
            [
                    -77.03257888555527,
                    -12.124696802237303
            ],
            [
                    -77.03006532043219,
                    -12.124623375687444
            ],
            [
                    -77.03135680407286,
                    -12.126657349201809
            ]
        ]]
    }
}

तो आप सरणियों का उपयोग कर सकते हैं लेकिन आप केवल वास्तव में दस्तावेज़ से मेल खा सकते हैं, न कि व्यक्तिगत सरणी सदस्य जो मैच का हिस्सा थे, इसलिए यह पूरी तरह से दस्तावेज़ों को वापस कर देगा और आपको यह पता लगाने की आवश्यकता होगी कि कौन से सदस्य क्लाइंट कोड में मानदंडों से मेल खाते हैं ।

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगो डीबी सर्वर स्टार्टअप चेतावनियां

  2. एक वैश्विक चर में, नेवला में कॉलबैक पुनर्प्राप्त करने के लिए कैसे सेट करें

  3. मोंगो जावा ड्राइवर से db.Collection.stats () को कैसे कॉल करें?

  4. जब मैं मोंगोडब सर्वर चलाता हूं तो स्टार्टअप के दौरान सॉकेट सेट अप करने में विफल कैसे हल कर सकता हूं?

  5. मोंगोडीबी सी # ड्राइवर और डेटटाइम फ़ील्ड