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

Akankah dokumen Mongo $near mengembalikan yang titik mana pun dalam MultiPoint berada dalam jangkauan?

Kasus untuk "dekat"

Jarak yang dipertimbangkan akan selalu dari titik "terdekat" dari Obyek GeoJSON yang disimpan. Hal yang sama berlaku untuk Polygon, atau MultiPolygon dan benar-benar semua objek GeoJSON yang valid untuk penyimpanan.

Pertimbangkan ini:

{
    "location": {
       "type": "MultiPoint",
       "coordinates": [
          [ -73.9580, 40.8003 ],
          [ -73.9498, 40.7968 ],
          [ -73.9737, 40.7648 ],
          [ -73.9814, 40.7681 ]
       ]
    }
}

Dan jika kita menggunakan agregasi $geoNear sebagai sarana untuk menunjukkan jarak dari lokasi tertentu:

db.geo.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [
               -73.97661209106445,
               40.774561857347244
            ]
        },
        "spherical": true,
        "distanceField": "distance"
    }}
])

Ini memberitahu kita bahwa jaraknya dianggap 824 meter.

Sekarang jika Anda menganggap setiap "Titik" sebagai dokumennya sendiri, bukan dalam koleksi, dan menjalankan proses kueri yang sama:

{
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.9814,
                        40.7681
                ]
        },
        "distance" : 824.837276194968
}
{
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.9737,
                        40.7648
                ]
        },
        "distance" : 1114.0666715946495
}
{
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.958,
                        40.8003
                ]
        },
        "distance" : 3266.4720692258156
}
{
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.9498,
                        40.7968
                ]
        },
        "distance" : 3351.9091229713567
}

Kemudian Anda melihat jarak yang berbeda dari setiap titik dari titik asal adalah kueri, di mana dalam kasus sebelumnya hanya "terdekat" yang benar-benar dipertimbangkan untuk keseluruhan objek.

Jadi ada buktinya, bahwa jarak diperhitungkan dengan $near /$geoNear atau selalu hanya titik terdekat ke titik asal yang digunakan dalam kueri.

Kasus untuk $geoWithin

$geoWithin namun operasinya berbeda. Pertimbangkan dokumen "MultiPoint" asli dan kemudian kueri ini:

db.geo.find({
    "location": {
        "$geoWithin": {
            "$geometry": {
                "type": "Polygon",
                "coordinates": [
                  [
                    [
                      -73.98382186889648,
                      40.75961056635002
                    ],
                    [
                      -74.00030136108398,
                      40.782751138401245
                    ],
                    [
                      -73.97317886352539,
                      40.78950978441435
                    ],
                    [
                      -73.95910263061523,
                      40.7720918760227
                    ],
                    [
                      -73.98382186889648,
                      40.75961056635002
                    ]
                  ]
                ]
            }
        }
    }
})

Ini tidak akan mengembalikan hasil apa pun, dan itu tidak akan terjadi karena "tidak semua" komponen Titik dari Objek terletak dalam batas-batas Poligon tge yang digunakan dalam kueri. Tetapi jika Anda menganggap setiap poin sebagai satu dokumen:

{
        "_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.9737,
                        40.7648
                ]
        }
}
{
        "_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
        "location" : {
                "type" : "Point",
                "coordinates" : [
                        -73.9814,
                        40.7681
                ]
        }
}

Kemudian dua titik akan terlihat berada di dalam Poligon. Tetapi karena ini tidak disimpan sebagai dokumen individual tetapi sebagai bagian dari "MutiPoint", maka kecuali semua bagian dari Objek itu terkandung dalam bentuk, maka hasilnya salah dan dokumen tidak dikembalikan.

Hal yang sama berlaku di sini untuk semua Objek GeoJSON yang pada dasarnya berisi kumpulan "Titik" dalam beberapa representasi.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB menghitung nilai yang berbeda?

  2. Impor CSV Menggunakan Skema Mongoose

  3. Menggunakan _id yang dihasilkan MongoDB sebagai data rahasia (misalnya, Token OAuth)

  4. Hubungan banyak-ke-banyak di CouchDB atau MongoDB

  5. MySQL ke MongoDB - Lembar Cheat Admin