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.29646421910687
yế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 /