MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongo $near ще върне ли документи, за които всяка точка в MultiPoint е в обхвата?

Калъф за „близо“

Разглежданото разстояние винаги ще бъде от „най-близката“ точка на всеки съхранен GeoJSON обект. Същото важи за Polygon или MultiPolygon и наистина всички GeoJSON обекти, които са валидни за съхранение.

Помислете за това:

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

И ако използваме агрегиране $geoNear като средство да ни покаже разстоянието от дадено местоположение:

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

Това ни казва, че разстоянието се счита за 824 метра.

Сега, ако смятате всяка „Точка“ за свой собствен документ вместо в колекцията и изпълните същия процес на заявка:

{
        "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
}

След това виждате различните разстояния на всяка точка от точката на произход е заявката, където в първия случай само „най-близкото“ всъщност е взето предвид за целия обект.

Така че има доказателство, че разстоянието, разглеждано с $near /$geoNear или винаги е самос най-близката точка до източника, използван в заявката.

Калъф за $geoWithin

$geoWithin операцията обаче е различна. Помислете за оригиналния документ "MultiPoint" и след това за тази заявка:

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
                    ]
                  ]
                ]
            }
        }
    }
})

Това няма да върне никакъв резултат и няма, защото „не всички“ Point компоненти на обекта лежат в границите на tge Polygon, използван в заявката. Но ако разглеждате всяка точка като един документ:

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

Тогава ще се види, че две от точките са вътре в многоъгълника. Но тъй като те не се съхраняват като отделни документи, а като част от "MutiPoint", тогава освен ако всички части от този обект се съдържат във формата, тогава резултатът е false и документът не се връща.

Същото важи и тук за всички GeoJSON обекти, които по същество съдържат колекция от „Точка“ в някакво представяне.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да обработвам кръгови документи в MongoDB/DynamoDB?

  2. Монгокли поддържа ли URL на формула за Apple M1 чипове?

  3. множество транзакции на документи не работят в c#, ​​използвайки сървър на общността mongodb 4.08

  4. node.js MongoDB заявката не връща резултати

  5. Проблем с MapReduce