2014-04-20 14 views
24

Tôi chỉ đang cố gắng để truy vấn near đơn giản hoạt động. Đây là một mẫu tài liệu của tô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} 
} 

và với mongod Tôi đã thử các lệnh:

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

nhưng tôi nhận được lỗi này:

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 }

lẽ google fu của tôi không phải là quá mạnh ngày nay nhưng tôi không thể tìm thấy bất cứ điều gì. Ngoài ra, tôi chạy lệnh chỉ mục đảm bảo. Ý định của tôi là đây là những vị trí bản đồ.

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

Trả lời

45

ít vấn đề, bạn đã tạo chỉ số của bạn trên bộ sưu tập foo của cơ sở dữ liệu foo, nhưng đang truy vấn bộ sưu tập thanh. Bạn cần phải có bộ sưu tập chính xác.

Đọc tài liệu bạn đã chèn, bạn cần thêm chỉ mục "2dsphere" vào support the geoJson objects. Chỉ số này cần phải được trên các yếu tố "điểm" của tài liệu của bạn, vì vậy hãy thử

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

Sau đó bạn có thể truy vấn như sau bằng cách cung cấp một GeoJSON obj cho truy vấn:

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

Tuyệt vời, đã giải quyết được sự cố của tôi bằng cách sử dụng: 'db. .ensureIndex ({point: "2dsphere"}); ' – AfromanJ

+0

Cảm ơn bạn thân, nó hoạt động như quyến rũ .. –

+1

Lưu ý rằng sine' 3.0.0' 'EnsureIndex' [đã không được chấp nhận] (https: //docs.mongodb. com/manual/reference/method/db.collection.ensureIndex /) và là bí danh cho 'createIndex' (câu trả lời đã chỉnh sửa tương ứng) –

3

Vì vậy, có vẻ như là một vài điều sai trái ở đây:

  • Từ dữ liệu bạn đang hiển thị cũng như thông tin truy vấn của bạn, thông tin liên quan được chứa trong trường và định dạng GeoJSON. tạo chỉ mục của bạn:
 
db.foo.createIndex({geo: "2d"}) 

Không "thất bại" vì có hiện nay không phải là một lĩnh vực được gọi là "địa lý" và lĩnh vực với các dữ liệu cần phải có được ở nơi đó. Nếu bạn đã sử dụng "điểm" thay vào đó, đó là trường chính xác, thì bạn sẽ nhận được một lỗi cho bạn biết rằng loại chỉ mục này không hợp lệ cho dữ liệu GeoJSON. Bạn cần một "2dsphere" chỉ số:

db.points.createIndex({ "point": "2dsphere" }) 
  • Mở rộng cùng một vấn đề, một lần nữa các dữ liệu ở định dạng GeoJSON và hình thức của truy vấn là đối với một di sản phối hợp cặp. Bạn cần thay đổi các tham số truy vấn để không còn bị lỗi:
 
db.points.find({point: { 
    $near: { 
     $geometry:{ 
      type: "Point", 
      coordinates: [-84.26060492426588, 30.45023887165371] 
     } 
    } 
}}) 

Xem tài liệu cho $near

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

này giải quyết cho cùng một vấn đề đối với tôi.

đâu prod là tên bộ sưu tập của tôi và vị trí là tên của cột mà các cửa hàng vị trí địa lý (GeoPoint)

Một số thảo luận về tương tự có thể được tìm thấy here

+1

cảm ơn rất nhiều. Điều này làm việc cho tôi! :) –

1

Ngoài các câu trả lời ở trên, nếu bạn' đã cố gắng tạo chỉ mục và có một số cú pháp hoặc trường sai, bạn có thể chạy

db.<yourcollection>.dropIndexes(); Để xóa tất cả chỉ mục và tạo lại chúng một cách chính xác.

Ngoài ra, chỉ số phải được tạo ra trên phụ huynh của "tọa độ", không phải trên tọa độ bản thân:

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

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

Chú ý, có "2d" và "2dsphere", sử dụng thứ hai vì đó là điều mới.

Các vấn đề liên quan