MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

gabungkan kueri geoNear dengan kueri lain untuk suatu nilai

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kueri mengembalikan hasil yang lebih dari yang diharapkan

  2. Cara menggunakan mongoimport untuk mengimpor csv

  3. Bagaimana Cara Membuat Skema Luwak dengan Array ID Objek?

  4. Pengecualian di utas monitor saat menghubungkan ke server localhost:27017 saat mengakses MongoDB dengan Java

  5. Agregasi MongoDB Menggunakan Java