2014-04-20 12 views
24

Sadece basit bir near sorgu çalışıyorum çalışıyorum. İşte belgemin bir örneği.

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

ve mongod ile ben komutu çalıştı:

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 }

Belki benim google-fu bugün çok keskin değil ama ben bulamadım:

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

ama bu hatayı alıyorum şey. Ayrıca, index indeks komutunu çalıştırdım. Benim niyetim bunlar harita konumları.

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

cevap

45

Küçük sorunlar var ama sen foo veritabanının foo koleksiyonu üzerinde endeksleri yarattı ama bar koleksiyonunu sorguluyorsunuz. Doğru koleksiyonda olmalısın.

Girdiğiniz belgeyi okurken, "2dsphere" dizinini support the geoJson objects'a eklemeniz gerekir. Bu indeks belgelerinizin "nokta" unsuru üzerinde olabilir, bu yüzden denemek gerekiyor

db.bar.createIndex({point:"2dsphere"}); 
sağlayarak Bundan sonra aşağıdaki sorgulayabilir

bir GeoJSON obj sorgu için:

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

Büyük, sorunum çözüldü: 'db. .ensureIndex ({point: "2dsphere"}); – AfromanJ

+0

Teşekkürler dostum, çekicilik gibi çalışıyor .. –

+1

"3.0.0" adlı sinusun [yani kullanımdan kaldırıldığını] unutmayın (https: //docs.mongodb. com/manual/reference/method/db.collection.ensureIndex /) ve 'createIndex' için bir takma addır (buna göre cevap düzenlenir) –

3

Yani görünüyor

  • verilerine itibaren gösteriyoruz ve ayrıca, sorgu bilgileri ilgili bilgi alan noktasının altında ve GeoJSON biçiminde bulunur: yanlış burada şeylerin bir çift olması. Sizin endeks oluşturma: halihazırda var "jeo" denilen bir alan değildir ve veriyle alan o yerde olmalıydı çünkü
 
db.foo.createIndex({geo: "2d"}) 

"başarısız" yapmaz. Bunun yerine "nokta" kullandıysanız, hangisi doğru alan ise, o zaman bu tür bir dizinin GeoJSON verisi için geçersiz olduğunu belirten bir hata alırdınız. Bir "2dsphere" endeksi gerekir:

db.points.createIndex({ "point": "2dsphere" }) 
  • aynı sorun genişletme, tekrar veri GeoJSON biçiminde olup sorgunun formu bir mirası için koordinat çifti olmasıdır. Artık başarısız böylece sorgu argümanları değiştirmeniz gerekir:
 
db.points.find({point: { 
    $near: { 
     $geometry:{ 
      type: "Point", 
      coordinates: [-84.26060492426588, 30.45023887165371] 
     } 
    } 
}}) 

Bu benim için aynı sorunla ilgili çözüldü $near

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

belgelerine bakın.prod benim koleksiyon adı ve konumu

'eğer aynı hakkında bazı tartışma yukarıdaki cevaplara ek olarak

+1

çok teşekkürler. Bu benim için çalıştı! :) –

1

here bulunabilir

coğrafi konumu (GeoPoint) depolayan sütunun adıdır zaten bir Index yaratmaya çalışmış ve bazı sözdizimi veya yanlış alanında, tüm dizinleri temizlemek ve bunları düzgün yeniden oluşturmak için

db.<yourcollection>.dropIndexes(); çalıştırabilirsiniz var ettik.

Ayrıca endeks "koordinatlar" ebeveyni oluşturulmalıdır değil kendini koordinatları:

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

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

Dikkat, "2dsphere" "2d" ve orada kullanmak ikinci olarak yeni şey.

İlgili konular