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

Temukan Lokasi di dalam Lingkaran yang tersimpan

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB tidak bekerja dengan PHP di WAMP

  2. pasport.js - mengautentikasi pengguna dari MongoDB dengan paspor-lokal

  3. Kapan mengindeks, apa yang harus diindeks di Mongoid?

  4. Tidak dapat terhubung ke mongodb errno:61 Koneksi ditolak

  5. Metode $push saya di Mongoose tidak berfungsi dengan baik