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

Lingkup Kueri Geospasial MongoDB Tumpang Tindih Titik Tunggal

Yah akan lebih baik jika Anda bisa menggunakan objek GeoJSON untuk mewakili lokasi tetapi pada saat ini jenis yang didukung sebenarnya terbatas jadi jenis "Lingkaran" yang ideal tidak didukung.

Yang paling dekat yang dapat Anda lakukan adalah "Poligon" yang mendekati lingkaran, tetapi ini mungkin terlalu banyak pekerjaan untuk dibuat hanya untuk tujuan kueri ini. Gotcha lain dengan melakukan ini dan kemudian menerapkan $geoIntersects adalah bahwa hasilnya tidak akan "diurutkan" berdasarkan jarak dari titik kueri. Tampaknya itu kebalikan dari tujuan menemukan "pizza terdekat" ke titik asal.

Untungnya ada $geoNear operasi ditambahkan ke kerangka kerja agregasi pada MongoDB 2.4 dan lebih tinggi. Hal yang baik di sini adalah memungkinkan "proyeksi" bidang jarak dalam hasil. Ini kemudian memungkinkan Anda untuk melakukan pemfilteran logis di server ke titik-titik yang "dalam radius" kendala dengan jarak dari titik asal. Ini juga memungkinkan penyortiran di server.

Tetapi Anda masih perlu mengubah skema Anda untuk mendukung indeks

db.places.insert({
    "name": "Pizza Hut",
    "location": { 
        "type": "Point",
        "coordinates": [
            151.00211262702942,
            -33.81696995135973
        ]
    },
    "radius": 20
})

db.places.ensureIndex({ "location": "2dsphere" })

Dan untuk kueri agregasi:

db.places.aggregate([

    // Query and project distance
    { "$geoNear": {
        "near": { 
            "type": "Point",
            "coordinates": [ 
                150.92094898223877,
                -33.77654333272719
            ]
        },
        "distanceField": "distance",
        "distanceMultiplier": 0.001,
        "maxDistance": 100000,
        "spherical": true
    }},

    // Calculate if distance is within delivery sphere
    { "$project": {
         "name": 1,
         "location": 1,
         "radius": 1,
         "distance": 1,
         "within": { "$gt": [ "$radius", "$distance" ] }
    }},

    // Filter any false results
    { "$match": { "within": true } },

    // Sort by shortest distance from origin
    { "$sort": { "distance": -1 } }
])

Pada dasarnya ini mengatakan,

Ada opsi lain yang dapat Anda berikan ke $geoNear untuk menyaring hasil, serta mengembalikan lebih dari 100 hasil default jika diperlukan dan pada dasarnya meneruskan opsi lain ke kueri seperti "ketik" atau "nama" atau informasi lain apa pun yang Anda miliki di dokumen.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Grup (Oleh) di luwak?

  2. mongodb tidak mungkin (?) E11000 duplikat kunci kesalahan kunci dup saat memasang

  3. Persingkat ID MongoDB dalam javascript

  4. Mengapa saya mendapatkan argumen yang tidak dikenal ke dateFromString:'format' meskipun memiliki versi db>3.6 yang mendukung agregasi

  5. Kesalahan mendapatkan MongoDB dengan _Id di Flask