Trường hợp "gần"
Khoảng cách được xem xét sẽ luôn là từ điểm "gần nhất" của bất kỳ Đối tượng GeoJSON nào được lưu trữ. Điều tương tự cũng xảy ra với Đa giác hoặc Đa giác và thực sự là tất cả các đối tượng GeoJSON có giá trị lưu trữ.
Hãy xem xét điều này:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
Và nếu chúng tôi sử dụng tổng hợp $geoNear
như một phương tiện để cho chúng tôi thấy khoảng cách từ một vị trí nhất định:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Điều này cho chúng tôi biết rằng khoảng cách được coi là 824 mét.
Bây giờ, nếu bạn coi mỗi "Điểm" là tài liệu riêng của nó trong bộ sưu tập và chạy cùng một quy trình truy vấn:
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
},
"distance" : 824.837276194968
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
},
"distance" : 1114.0666715946495
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.958,
40.8003
]
},
"distance" : 3266.4720692258156
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9498,
40.7968
]
},
"distance" : 3351.9091229713567
}
Sau đó, bạn thấy các khoảng cách khác nhau của mỗi điểm từ điểm gốc là truy vấn, trong trường hợp trước đây, chỉ "gần nhất" thực sự được xem xét cho toàn bộ đối tượng.
Vì vậy, có bằng chứng rằng khoảng cách được xem xét với $near
/ $geoNear
hoặc luôn là chỉ điểm gần nhất với điểm gốc được sử dụng trong truy vấn.
Vỏ cho $ geoWithin
$geoWithin
tuy nhiên hoạt động là khác nhau. Hãy xem xét tài liệu "MultiPoint" lâu năm và sau đó truy vấn sau:
db.geo.find({
"location": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": [
[
[
-73.98382186889648,
40.75961056635002
],
[
-74.00030136108398,
40.782751138401245
],
[
-73.97317886352539,
40.78950978441435
],
[
-73.95910263061523,
40.7720918760227
],
[
-73.98382186889648,
40.75961056635002
]
]
]
}
}
}
})
Điều này sẽ không trả về bất kỳ kết quả nào và nó sẽ không bởi vì "không phải tất cả" Thành phần điểm của Đối tượng nằm trong giới hạn của Đa giác tge được sử dụng trong truy vấn. Nhưng nếu bạn coi mỗi điểm là một tài liệu duy nhất:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Sau đó, hai trong số các điểm sẽ được nhìn thấy bên trong Đa giác. Nhưng vì chúng không được lưu trữ dưới dạng tài liệu riêng lẻ mà là một phần của "MutiPoint", nên trừ khi tất cả các phần của Đối tượng đó được chứa trong hình dạng, khi đó kết quả là false và tài liệu không được trả về.
Điều này cũng đúng ở đây đối với tất cả các Đối tượng GeoJSON về cơ bản chứa tập hợp các "Điểm" trong một số biểu diễn.