2014-04-05 12 views
5

मैं mongodb में कुछ भौगोलिक स्थान कार्यक्षमता का उपयोग करने की कोशिश कर रहा हूं। $ के साथ एक खोज क्वेरी का उपयोग करना प्रतीत नहीं होता है!

{ 
    "Username": "Deano", 
    "_id": { 
     "$oid": "533f0b722ad3a8d39b6213c3" 
    }, 
    "location": { 
     "type": "Point", 
     "coordinates": [ 
      51.50998, 
      -0.1337 
     ] 
    } 
} 

मैं निम्नलिखित सूचकांक के रूप में अच्छी तरह से स्थापित किया है::

मैं वर्तमान में मेरे डेटाबेस में इस वस्तु है

{ 
    "v": 1, 
    "key": { 
    "location": "2dsphere" 
    }, 
    "ns": "heroku_app23672911.catchmerequests", 
    "name": "location_2dsphere", 
    "background": true 
} 

जब मैं इस क्वेरी चलाएँ:

db.collectionname.find({ "location" : { $near : [50.0 , -0.1330] , $maxDistance : 10000 }}) 

मुझे यह त्रुटि मिलती है:

error: { 
    "$err" : "can't parse query (2dsphere): { $near: [ 50.0, -0.133 ], $maxDistance: 10000.0 }", 
    "code" : 16535 
} 

क्या कोई जानता है कि मैं कहां गलत हो रहा हूं? कोई भी सहायताकाफी प्रशंसनीय होगी!

उत्तर

11

ऐसा लगता है कि यदि आपका डेटा GeoJSON प्रारूप में भी है, तो आपको GeoJSON प्रारूप का उपयोग करने की आवश्यकता है। यदि आप का उपयोग करें:

db.collectionname.find({ 
    "location": { 
     $near: { 
      $geometry: 
       { type: "Point", coordinates: [50.0, -0.1330] }, $maxDistance: 500 
     } 
    } 
}) 

यह काम करना चाहिए। मैं फ़ील्ड के लिए जियोज़सन स्टोरेज प्रारूप का उपयोग करके अपनी त्रुटि दोहरा सकता हूं, लेकिन डॉक्स क्वेरी अभिव्यक्ति में विरासत बिंदुओं को क्या कहते हैं। मुझे लगता है कि दस्तावेज़ थोड़ा अस्पष्ट हैं कि वे सुझाव देते हैं कि आप 2 डीएसपीयर इंडेक्स 2dsphere

के साथ दोनों GeoJSON और विरासत निर्देशांक का उपयोग कर सकते हैं, मैं 2.4.10 का उपयोग कर रहा हूं, क्योंकि यह क्या लायक है, क्योंकि स्थानिक में कुछ बड़े बदलाव थे 2.4 रिलीज में।

+0

अरे, मैं वास्तव में अधिकतमडिस्टेंस पर ध्यान दिए बिना पहले निकटतम स्थान की खोज करने की कोशिश कर रहा हूं। यह काम करता है लेकिन इसमें 4 सेकंड लगते हैं, यह वास्तव में धीमा है। प्रदर्शन बढ़ाने का एक तरीका है? – John

+0

@ जॉन। मुझे आपके द्वारा प्रदान की गई जानकारी से नहीं पता है, लेकिन अधिकतम डिस्टेंस छोड़ने का अर्थ है पूरे डीबी को खोजना, जो आकार के आधार पर, बहुत लंबा समय ले सकता है। –

+0

'$ पास के पास 'निकटतम से सबसे दूर तक दाएं? फिर मैं सीमा() का उपयोग कर रहा हूँ। मेरे डेटाबेस में मेरा स्थान इस तरह दिखता है: '[-5.95001220703125,46.149993896484375] 'इसलिए जब मैं' -5, -46] भेजता हूं तो इसमें 2 - 3 सेकंड लगेंगे। लेकिन अगर मैं यह स्थान भेजता हूं E.g '[-5.953801, 46.001843] 'यह वास्तव में तेज़ है। मुझे परिणाम केवल '22ms' में मिलता है। तो यह सामान्य है? – John

1

यह बिल्कुल एक समाधान नहीं है क्योंकि मुझे उपर्युक्त काम नहीं मिला है, लेकिन भू-ज्ञान का उपयोग करके मैं जो चाहता था उसे प्राप्त करने में कामयाब रहा।

db.runCommand({ geoNear : 'catchmerequests', near: 
{ type: 'Point', coordinates : [50, 50] }, spherical : true }); 

किसी को भी बाहर क्यों प्रयास के पास मूल $ में विफल रहा है कि अभी भी सराहना की होगी पा सकते हैं, लेकिन मैं और कौन कौन एक काम विकल्प की तलाश में है किसी और के लिए यह पोस्टिंग कर रहा हूँ है।

+0

मैंने पोस्ट किया है जो मुझे लगता है कि एक समाधान है। थोड़ी देर के लिए मोंगो स्थानिक के साथ खेलने का अर्थ रहा है - मैं एक पोस्टगिस लड़का हूं - और मैंने इसका आनंद लिया। धन्यवाद। –

+0

@Dealss मैंने देखा है कि उपर्युक्त उत्तर समाधान के रूप में चिह्नित किया गया था, लेकिन मैं यहां देखता हूं कि यह आपके लिए काम नहीं करता है और आप geoNear समाधान का उपयोग कर रहे हैं। मैंने मोंगोडीबी दस्तावेज़ों में नीचे दिया गया संदर्भ देखा और यह सोच रहा था कि आपने मेरे जैसा ही किया है और आपके दस्तावेज़ को "डाला" है। _ सम्मिलित करने के लिए, मोंगोडीबी दस्तावेज़ को सम्मिलित करता है लेकिन 2dsphere अनुक्रमणिका में नहीं जोड़ता है ._ क्या आपको $ के साथ काम करने का मूल समाधान भी मिला? http://docs.mongodb.org/manual/core/2dsphere/ – Ravenous

संबंधित मुद्दे