2014-04-20 12 views
24

मैं बस एक साधारण near क्वेरी काम करने की कोशिश कर रहा हूं। यहां मेरे दस्तावेज़ का एक नमूना है।

{"point": 
    {"type": "Point", 
    "coordinates": [30.443902444762696, -84.27326978424058]}, 
    "created_on": {"$date": 1398016710168}, 
    "radius": 180, 
    "user": {"$oid": "53543188eebc5c0cc416b77c"}, 
    "_id": {"$oid": "53544306eebc5c0ecac6cfba"}, 
    "expires_on": {"$date": 1399831110168} 
} 

और mongod साथ मैं आदेश की कोशिश की:

error: { "$err" : "Unable to execute query: error processing query: ns=foo.bar skip=0\nTree: GEONEAR field=point maxdist=1.79769e+308 isNearSphere=0 || First: notFirst: full path: point\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query", "code" : 17007 }

शायद मेरे गूगल फू इतना तेज आज नहीं है, लेकिन मैं नहीं मिल सकता है:

db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}}); 

लेकिन मैं इस त्रुटि मिलती है कुछ भी। इसके अलावा, मैं सुनिश्चित सूचकांक आदेश चला गया। मेरा इरादा यह है कि ये मानचित्र स्थान हैं।

db.bar.ensureIndex({a:1}); 
db.bar.ensureIndex({geo:"2d"}); 

उत्तर

45

कुछ समस्याएं हैं, आप foo डेटाबेस की foo संग्रह पर अपनी अनुक्रमणिका बनाया है, लेकिन बार संग्रह जानना चाहते हैं। आपको सही संग्रह पर होना चाहिए।

आपके द्वारा डाले गए दस्तावेज़ को पढ़ने के लिए आपको support the geoJson objects पर "2dsphere" अनुक्रमणिका जोड़ने की आवश्यकता है। यह सूचकांक अपने दस्तावेज़ों के तत्व "बिंदु" पर हो, तो कोशिश करने की जरूरत है

db.bar.createIndex({point:"2dsphere"}); 

तो आप के रूप में उपलब्ध कराने के द्वारा इस प्रकार क्वेरी कर सकता है एक GeoJSON obj क्वेरी के लिए:

db.bar.find(
    { point : 
     { $near : 
      { 
      $geometry : { 
       type : "Point" , 
       coordinates : [-84.27326978424058, 30.443902444762696] }, 
      $maxDistance : 1 
      } 
     } 
    } 
) 
+3

ग्रेट, मेरा मुद्दा हल करके हल किया: 'डीबी। .ensureIndex ({point: "2dsphere"}); ' – AfromanJ

+0

धन्यवाद दोस्त, यह आकर्षण की तरह काम कर रहा है .. –

+1

ध्यान दें कि '3.0.0'' सुनिश्चित करें इंडेक्स 'को हटा दिया गया है [https: //docs.mongodb। कॉम/मैनुअल/संदर्भ/विधि/db.collection.ensureIndex /) और 'createIndex' के लिए उपनाम है (तदनुसार संपादित किया गया जवाब) –

3

तो वहाँ जा रहा है यहां कुछ चीजें गलत हों:

  • आपके द्वारा दिखाए जा रहे डेटा से और आपकी क्वेरी जानकारी से प्रासंगिक जानकारी फ़ील्ड पॉइंट और जियोज़सन प्रारूप में निहित है। आपका सूचकांक सृजन:
 
db.foo.createIndex({geo: "2d"}) 

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

db.points.createIndex({ "point": "2dsphere" }) 
  • एक ही समस्या का विस्तार, फिर डेटा GeoJSON प्रारूप में है और क्वेरी के रूप एक विरासत के लिए समन्वय कि जोड़ी है। आप तो यह है कि अब और नहीं विफल रहता है क्वेरी तर्कों को बदलने की जरूरत:
 
db.points.find({point: { 
    $near: { 
     $geometry:{ 
      type: "Point", 
      coordinates: [-84.26060492426588, 30.45023887165371] 
     } 
    } 
}}) 

के लिए $near

5
db.prod.createIndex({ "location": "2d" }) 

यह मेरे लिए एक ही मुद्दे के लिए हल दस्तावेज़ देखें।

कहाँ prod मेरे संग्रह का नाम और स्थान है स्तंभ का नाम जो भू स्थान (GeoPoint)

ही के बारे में कुछ चर्चा here

+1

बहुत बहुत धन्यवाद। यह मेरे लिए काम किया! :) –

1

ऊपर पाया जा सकता है जवाब के अलावा संग्रहीत करता है, यदि आप है ' पहले से ही एक इंडेक्स बनाने की कोशिश की है और कुछ वाक्यविन्यास या फ़ील्ड गलत है, तो आप

db.<yourcollection>.dropIndexes(); सभी इंडेक्स को साफ़ करने और उन्हें ठीक से फिर से बनाने के लिए चला सकते हैं।

इसके अलावा, सूचकांक "निर्देशांक" की मूल पर बनाया जाना चाहिए, नहीं पर ही निर्देशांक:

{ 
    "_id": 59ac03d168eaaa14c2a57a00", 
    "location":{ 
     "type":"Point", 
     "coordinates":[ 
     131.6667, 
     57.8368 
     ] 
    }, 
    "age":53, 
    "username":"Brandi_Greenfelder" 
} 

db.<yourcollection>.createIndex({ location: '2dsphere' });

ध्यान दें, वहाँ है "2 डी" और "2dsphere", का उपयोग दूसरा यह नई बात है।

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