Từ khóa là sphere
để phân biệt giữa $ gần
và $ nearSphere
.
Như bạn đã biết, $nearSphere
được nêu để tính toán khoảng cách bằng cách sử dụng hình học hình cầu. Điều này liên quan đến Earth phép chiếu bản đồ
( biến dạng
). Nơi chỉ mục MongoDB 2d
dựa trên Descartes
và chỉ mục MongoDB 2dsphere
dựa trên Trắc địa
.
Lý thuyết là đủ, chúng ta hãy sử dụng một số ví dụ. Giả sử chúng ta có hai tài liệu như sau:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
Hướng dẫn sử dụng cho cả hai toán tử chỉ định rằng chúng ta có thể sử dụng:
-
2dsphere
lập chỉ mục cho dữ liệu vị trí được xác định là GeoJSON điểm -
2d
lập chỉ mục cho dữ liệu vị trí được xác định là cặp tọa độ kế thừa
Chỉ mục:2dsphere, Truy vấn:GeoJSON
db.map.createIndex({"location": "2dsphere"});
db.map.find({"location":{"$nearSphere":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ] }}}});
db.map.find({"location":{"$near":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ]}}}});
Trong trường hợp này, cả hai truy vấn sẽ trả về cùng một kết quả vì chỉ mục được lưu trữ trong 2dsphere
.
Kết quả:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Chỉ mục:2d, Truy vấn:Tọa độ kế thừa
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
Đây là nơi sự khác biệt xảy ra, kết quả cho $nearSphere
được tính toán theo hình cầu bất chấp chỉ mục, trong khi $near
được tính toán trong phép chiếu phẳng.
Kết quả:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Xem gist:JS test script của ví dụ trên. Điều này đã được kiểm tra bằng cách sử dụng MongoDB v3.4.4.
Ngoài ra, hãy xem Truy vấn và chỉ mục không gian địa lý .