Anda tidak dapat melakukan ini seperti ini — secara umum Anda tidak dapat mendasarkan apa pun dalam kueri MongoDB Anda pada nilai dalam koleksi.
Namun, sejak MongoDB 2.4 kami mendukung indeks baru yang disebut 2dsphere
yang memungkinkan Anda untuk menyimpan tidak hanya titik dalam database, tetapi juga poligon. Anda akan menyimpan informasi itu dalam dokumen seperti:
db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
} );
Kemudian Anda dapat menggunakan kueri "berpotongan" untuk mengetahui apakah suatu titik tercakup oleh setiap poligon:
db.so.find( {
'loc' : {
$geoIntersects: {
$geometry: { type: 'Point', coordinates: [ 0, 0 ] }
}
}
} );
Yang kemudian mengembalikan:
{
"_id" : ObjectId("51f24d566775068ab0b786f0"),
"name" : "Firestation 1",
"loc" : {
"type" : "Polygon",
"coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
}
Di sini ia menemukan stasiun pemadam kebakaran, karena 0, 0 berada di tengah poligon. Sekarang triknya tentu saja menghitung titik poligon yang membentuk lingkaran yang "berjari-jari" (katakanlah 10km) dari titik pusat. Anda tidak akan bisa mendapatkan lingkaran yang sebenarnya, tetapi segi enam atau segi delapan sudah cukup. Matematika untuk itu tidak terlalu sederhana, tetapi http:// www.movable-type.co.uk/scripts/latlong.html#destPoint memiliki contoh di JavaScript. Cukup lingkari bantalan Anda dalam 8 langkah dari 0 hingga 2PI untuk menghitung titik di sepanjang keliling lingkaran, dan letakkan di koordinat. Pastikan untuk menyematkannya dalam array bersarang ganda dan buat yang pertama dan yang terakhir sama:
{
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [
[ point1-lon, point1-lat ],
[ point2-lon, point2-lat ],
[ point3-lon, point3-lat ],
...
[ point1-lon, point1-lat ],
] ]
}
}