Selama server MongoDB Anda cukup baru, menjadi versi 2.6 atau lebih tinggi, maka fungsi ini sebenarnya telah dipindahkan ke mesin kueri umum. Metode luwak di sini membungkus .runCommand()
form yang dianggap tidak digunakan lagi untuk semua rilis mendatang, jadi ini hanya masalah menempatkan kueri standar dengan operator tambahan.
GeoLocation.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"$maxDistance": distanceInMeters
},
"loc.type": "Point"
},function(err,docs) {
// The documents are also mongoose document objects as well
});
Lihat opsi lebih lanjut di $nearSphere
atau operator lain untuk opsi. Perbedaan utama di sini adalah $maxDistance
dalam meter saat formulir GeoJSON digunakan, bukan radian jika sebaliknya.
Tentu saja ada juga $geoNear
operator untuk pipa agregasi. Ini tersedia pada MongoDB 2.4 dan dapat mengambil opsi lain seperti "permintaan" untuk mempersempit hasil lebih lanjut. Keuntungan lain yang mungkin di sini adalah ia akan "memproyeksikan" bidang ke hasil Anda yang mewakili "jarak" dari titik kueri. Ini dapat digunakan dalam perhitungan lain atau penyortiran khusus:
GeoLocation.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"distanceField": "distance",
"maxDistance": distanceInMeters,
"spherical": true,
"query": { "loc.type": "Point" }
}},
{ "$sort": { "distance": -1 } } // Sort nearest first
],
function(err,docs) {
// These are not mongoose documents, but you can always cast them
}
);
Perbedaan lain yang perlu diperhatikan adalah bahwa dalam bentuk kueri standar, hasilnya tidak lagi terbatas pada 100 dokumen seperti dalam bentuk "perintah". Agregasi $geoNear
batas hingga 100 dokumen sebagai hasil secara default, tetapi jumlah dokumen yang dikembalikan dapat disetel dengan opsi "batas" tambahan untuk perintah pipa. Pernyataan agregat tidak "mengurutkan" hasil selain dari dokumen maksimum yang dikembalikan dari pencarian adalah hasil teratas yang diberikan ketentuan, tetapi tidak dikembalikan secara berurutan, jadi Anda perlu mengurutkannya seperti yang ditunjukkan.
Dalam kedua kasus tersebut, Anda harus memindahkan kode Anda untuk menggunakan salah satu dari formulir ini karena formulir perintah dianggap tidak digunakan lagi dan akan dihapus di masa mendatang. Apakah API luwak mempertahankan metodenya sebagai "pembungkus" untuk salah satu formulir ini tidak diketahui, tetapi sebagian besar tidak mungkin, jadi lebih baik tetap menggunakan formulir yang didukung.