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

$geoNear cocok dengan array terdekat

Pertama, saya sangat menyarankan agar Anda membuat indeks "2dsphere" untuk koleksi Anda jika Anda ingin melakukan kueri geospasial pada koordinat dunia nyata.

Pastikan untuk menghapus indeks lain yang mungkin Anda mainkan:

db.records.dropIndexes();
db.records.createIndex({ "addresses.loc": "2dsphere" })

Untuk melakukan apa yang Anda inginkan, pertama-tama lihat sedikit modifikasi yang juga menyertakan includeLocs opsi untuk $geoNear

db.records.aggregate([
  { "$geoNear": {
     "near": [ -73.9815103, 40.7475731 ],
     "spherical": true,
     "distanceField": "distance",
     "includeLocs": "locs"
  }}
])

Sekarang Anda akan melihat output yang terlihat seperti ini:

{
        "_id" : ObjectId("592d0c78555a7436b0883960"),
        "userid" : 7,
        "addresses" : [
                {
                        "apporx" : 50,
                        "loc" : [
                                -73.98137109999999,
                                40.7476039
                        ]
                },
                {
                        "apporx" : 15,
                        "loc" : [
                                -73.982002,
                                40.74767
                        ]
                },
                {
                        "apporx" : 10,
                        "loc" : [
                                -73.9819567,
                                40.7471609
                        ]
                }
        ],
        "distance" : 0.0000019174641401278624,
        "locs" : [
                -73.98137109999999,
                40.7476039
        ]
}

Jadi yang dikembalikan bukan hanya jarak ke titik yang paling dekat tetapi "lokasi" mana yang cocok digunakan.

Jadi jika Anda ingin $filter array asli untuk mengembalikan yang terdekat, maka Anda dapat:

db.records.aggregate([
  { "$geoNear": {
     "near": [ -73.9815103, 40.7475731 ],
     "spherical": true,
     "distanceField": "distance",
     "includeLocs": "locs"
  }},
  { "$addFields": {
    "addresses": {
      "$filter": {
        "input": "$addresses",
        "as": "address",
        "cond": { "$eq": [ "$$address.loc", "$locs" ] }
      }
    }
  }}
])

Dan itu mengembalikan array hanya dengan kecocokan itu:

{
        "_id" : ObjectId("592d0c78555a7436b0883960"),
        "userid" : 7,
        "addresses" : [
                {
                        "apporx" : 50,
                        "loc" : [
                                -73.98137109999999,
                                40.7476039
                        ]
                }
        ],
        "distance" : 0.0000019174641401278624,
        "locs" : [
                -73.98137109999999,
                40.7476039
        ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Daftar Periksa Pengembangan &Operasi untuk MongoDB

  2. Cluster MongoDB Berkinerja Tinggi di Azure

  3. Cluster MongoDB yang terdistribusi secara geografis di AWS di wilayah UE

  4. MongoDB $cmp

  5. Argumen harus berupa string di nodejs