Mongodb - Trả lại các điểm gần nhất với một vị trí, với khoảng cách


7

MongoDB tương đương với truy vấn này là gì:

SELECT 111151.29341326 * SQRT( pow(-6.186753-`Latitude`, 2) 
                               + pow(106.772835-`Longitude`, 2)
                                 * cos(-6.186753*0.017453292519943)
                                 * cos(`Latitude`*0.017453292519943)
                             )
       as distance
from tablename ;

Điều này sử dụng công thức haversine để tính khoảng cách vòng tròn lớn đến một điểm cố định. Chúng tôi muốn nhận được 20 điểm gần nhất từ ​​một vị trí và sau đó hiển thị khoảng cách.

Câu trả lời:


7

MongoDB đã được xây dựng để hỗ trợ cho Geoindexing. Bạn không cần phải tự làm phép tính.

Về cơ bản, bạn sẽ tạo một trường có lat / long được lưu dưới dạng một mảng hoặc dưới dạng tài liệu phụ, một cái gì đó giống như một trong những điều sau:

{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }

Sau đó lập chỉ mục trường loc mới một cách thích hợp:

db.places.ensureIndex( { loc : "2d" } )

Cuối cùng, bạn có thể sử dụng một trong các toán tử để truy vấn một điểm cho 20 kết quả gần nhất:

db.places.find( { loc : { $near : [50,50] } } ).limit(20)

Tất nhiên, bạn có thể chỉ cần sử dụng MongoDB để lưu trữ dữ liệu, sau đó rút thông tin ra khỏi DB bằng find () và thực hiện phép tính phía máy khách nhưng tôi tưởng tượng đó không phải là điều bạn muốn làm.

Nếu phần khoảng cách của phương trình là những gì bạn muốn:

http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand

Toán tử $ GeoNear cũng sẽ trả về khoảng cách. Một ví dụ:

> db.runCommand( { geoNear : "places" , near : [50,50], num : 10 } );
{
        "ns" : "test.places",
        "near" : "1100110000001111110000001111110000001111110000001111",
        "results" : [
                {
                        "dis" : 69.29646421910687,
                        "obj" : {
                                "_id" : ObjectId("4b8bd6b93b83c574d8760280"),
                                "y" : [
                                        1,
                                        1
                                ],
                                "category" : "Coffee"
                        }
                },
                {
                        "dis" : 69.29646421910687,
                        "obj" : {
                                "_id" : ObjectId("4b8bd6b03b83c574d876027f"),
                                "y" : [
                                        1,
                                        1
                                ]
                        }
                }
        ],
        "stats" : {
                "time" : 0,
                "btreelocs" : 1,
                "btreelocs" : 1,
                "nscanned" : 2,
                "nscanned" : 2,
                "objectsLoaded" : 2,
                "objectsLoaded" : 2,
                "avgDistance" : 69.29646421910687
        },
        "ok" : 1
}

Các "dis" : 69.29646421910687yếu tố là những gì bạn đang tìm kiếm, cũng có một tùy chọn khoảng cách hình cầu.

Đối với tất cả điều này, làm thế nào để sử dụng khoảng cách và hơn thế nữa, hãy xem ở đây để biết thêm thông tin về các chỉ mục địa lý và cách sử dụng chúng:

http://www.mongodb.org/display/DOCS/Geospatial+ Indexing /


Tôi hiểu điều đó rồi. Nhưng tôi muốn kết quả trả về chứa trường "khoảng cách". Làm thế nào để đạt được điều đó?
dùng4951

1
Tôi không nghĩ rằng bạn đã đọc trang tôi đã liên kết - Tôi đã mở rộng câu trả lời để bao gồm các toán tử trả về khoảng cách, họ chỉ ở xa trang hơn
Adam C

Thế còn nếu cột bổ sung mà chúng ta muốn có không phải là khoảng cách mà là thứ khác thì sao?
dùng4951

"Một cái gì đó khác" quá mơ hồ để trả lời, nếu bạn muốn tính toán chung thì Map / Giảm hoặc Khung tổng hợp trong 2.2
Adam C

Trong MySQL, bạn có thể thêm các cột vào kết quả bạn muốn, thường dựa trên công thức. Nếu bảng có 4 cột, bạn có thể xem với 6 cột. Bạn có thể làm điều đó trên mongodb? Có vẻ như bạn cần lấy dữ liệu và tự tính toán các cột. Tôi chỉ đang cố gắng để đảm bảo.
dùng4951
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.