Bahkan lebih optimal dari aslinya, sekarang Anda dapat menggunakan $expr
dalam $match
tahap setelah $geoNear
awal
:
db.collection.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
{ "$match": { "$expr": { "$lte": [ "$distance", "$radius" ] } }}
])
Sebenarnya sedikit lebih optimal dibandingkan saat pertama kali ditulis. Sekarang kita bisa $redact
daripada $project
boolean dan $match
nanti:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius and remove if not
{ "$redact": {
"$cond": {
"if": { "$lte": [ "$distance", "$radius" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Anda telah menyimpan informasi dengan tepat sebagaimana seharusnya, tetapi ada pendekatan yang berbeda untuk mendapatkan hasil dari yang Anda kira.
Yang ingin Anda gunakan adalah $geoNear
dan khususnya kerangka kerja agregasi
bentuk operator tersebut. Inilah yang Anda lakukan:
db.collection.aggregate([
// Match documents "near" the queried point
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ 23.027573, 72.50675800000001 ],
},
"distanceField": "distance"
}},
// Calculate if distance is within radius
{ "$project": {
"location": 1,
"radius": 1,
"distance": 1,
"within": { "$lte": [ "$distance", "$radius" ] }
}},
// Match only documents within the radius
{ "$match": { "within": true } }
])
Sehingga formulir tersebut memungkinkan jarak dari titik yang ditanyakan untuk "diproyeksikan" dalam hasil, sementara kueri juga hanya akan mengembalikan dokumen terdekat.
Kemudian Anda menggunakan perbandingan logis untuk melihat apakah nilai "jarak" lebih kecil dari "jari-jari", oleh karena itu di dalam lingkaran.
Terakhir, Anda mencocokkan untuk memfilter hanya hasil yang pernyataan "dalam" itu benar.
Anda dapat menambahkan opsi lain ke $geoNear
seperti yang ditunjukkan dalam dokumentasi. Saya juga sangat menyarankan bahwa penyimpanan Anda juga harus menggunakan format GeoJSON karena kemungkinan besar akan lebih kompatibel dengan perpustakaan lain apa pun yang mungkin Anda gunakan untuk mengerjakan hasil yang diperoleh.