sql >> Databáze >  >> NoSQL >> MongoDB

Vrátí Mongo $ blízko dokumenty, pro které je jakýkoli bod v MultiPointu v dosahu?

Případ pro "blízko"

Uvažovaná vzdálenost bude vždy od „nejbližšího“ bodu jakéhokoli uloženého objektu GeoJSON. Totéž platí pro Polygon nebo MultiPolygon a skutečně všechny GeoJSON objekty, které jsou platné pro ukládání.

Zvažte toto:

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

A pokud použijeme agregaci $geoNear jako prostředek k zobrazení vzdálenosti od daného místa:

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

To nám říká, že vzdálenost je považována za 824 metrů.

Nyní, pokud jste považovali každý „bod“ za svůj vlastní dokument místo v kolekci a spustili stejný proces dotazu:

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

Pak vidíte různé vzdálenosti každého bodu od výchozího bodu, to je dotaz, kde v prvním případě byl pro celý objekt ve skutečnosti uvažován pouze „nejbližší“.

Existuje tedy důkaz, že vzdálenost uvažovaná s $near /$geoNear nebo je vždy pouze nejbližší bod k počátku použitému v dotazu.

Pouzdro pro $geoWithin

$geoWithin provoz je však jiný. Zvažte původní dokument "MultiPoint" a poté tento dotaz:

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

To nevrátí žádný výsledek a nevrátí se, protože "ne všechny" Bodové komponenty objektu leží v mezích tge Polygon použitého v dotazu. Ale pokud jste považovali každý bod za jeden dokument:

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

Pak by se dva z bodů nacházely uvnitř mnohoúhelníku. Ale protože tyto nejsou uloženy jako jednotlivé dokumenty, ale jako součást „MutiPoint“, pak pokud všechny části tohoto objektu jsou obsaženy ve tvaru, pak je výsledek nepravdivý a dokument není vrácen.

Totéž zde platí pro všechny GeoJSON Objects, které v podstatě obsahují kolekci "Point" v nějaké reprezentaci.




  1. prohledávání databáze pomocí mongoose api a nodejs?

  2. Mongoose - Dotaz na nejnovější dokument

  3. Použijte Heroku addon mongolab s node.js

  4. spring-boot redis :Jak zrušit platnost všech relací uživatele?