Kasus untuk "dekat"
Jarak yang dipertimbangkan akan selalu dari titik "terdekat" dari Obyek GeoJSON yang disimpan. Hal yang sama berlaku untuk Polygon, atau MultiPolygon dan benar-benar semua objek GeoJSON yang valid untuk penyimpanan.
Pertimbangkan ini:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
Dan jika kita menggunakan agregasi $geoNear
sebagai sarana untuk menunjukkan jarak dari lokasi tertentu:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
Ini memberitahu kita bahwa jaraknya dianggap 824 meter.
Sekarang jika Anda menganggap setiap "Titik" sebagai dokumennya sendiri, bukan dalam koleksi, dan menjalankan proses kueri yang sama:
{
"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
}
Kemudian Anda melihat jarak yang berbeda dari setiap titik dari titik asal adalah kueri, di mana dalam kasus sebelumnya hanya "terdekat" yang benar-benar dipertimbangkan untuk keseluruhan objek.
Jadi ada buktinya, bahwa jarak diperhitungkan dengan $near
/$geoNear
atau selalu hanya titik terdekat ke titik asal yang digunakan dalam kueri.
Kasus untuk $geoWithin
$geoWithin
namun operasinya berbeda. Pertimbangkan dokumen "MultiPoint" asli dan kemudian kueri ini:
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
]
]
]
}
}
}
})
Ini tidak akan mengembalikan hasil apa pun, dan itu tidak akan terjadi karena "tidak semua" komponen Titik dari Objek terletak dalam batas-batas Poligon tge yang digunakan dalam kueri. Tetapi jika Anda menganggap setiap poin sebagai satu dokumen:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
Kemudian dua titik akan terlihat berada di dalam Poligon. Tetapi karena ini tidak disimpan sebagai dokumen individual tetapi sebagai bagian dari "MutiPoint", maka kecuali semua bagian dari Objek itu terkandung dalam bentuk, maka hasilnya salah dan dokumen tidak dikembalikan.
Hal yang sama berlaku di sini untuk semua Objek GeoJSON yang pada dasarnya berisi kumpulan "Titik" dalam beberapa representasi.