$geometry

De $geometry operator geeft een GeoJSON-geometrieobject op voor georuimtelijke query's. Het wordt gebruikt in andere georuimtelijke operators om shapes en punten voor ruimtelijke berekeningen te definiëren.

Syntaxis

{
  $geometry: {
    type: <GeoJSON type>,
    coordinates: <coordinates>
  }
}

Parameterwaarden

Kenmerk Description
type GeoJSON-objecttype (punt, veelhoek, multipolygon, enzovoort)
coordinates Coördinaten die het GeoJSON-object definiëren als een matrix

Voorbeelden

Laten we het gebruik begrijpen met voorbeeld-json uit stores de gegevensset.

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

Voorbeeld 1: Dichtstbijzijnde winkels zoeken naar puntgeometrie

Voor betere prestaties begint u met het maken van de vereiste 2dsphere index.

db.stores.createIndex({ location: "2dsphere" })

De query haalt maximaal twee winkels op die het dichtst bij het punt bij coördinaten liggen [46.2917, -62.6354], gesorteerd op nabijheid. Hierbij wordt de operator $near gebruikt om resultaten te sorteren op afstand van een specifiek punt, zodat winkels kunnen worden gevonden die geografisch het dichtst bij een bepaalde locatie liggen.

db.stores.find({
  location: {
    $near: {
      $geometry: {
        type: "Point",
        coordinates: [46.2917, -62.6354]
      }
    }
  }
}, {
  name: 1,
  location: 1
}).limit(2)

De eerste twee resultaten die door deze query worden geretourneerd, zijn:

[
  {
    "_id": "59c355e9-586c-44f8-bbaf-a87989142119",
    "name": "Relecloud | Outdoor Furniture Shop - Chetside",
    "location": { "lat": 46.188, "lon": -62.2789 }
  },
  {
    "_id": "d3a9cc23-e6ae-4806-93ac-1ade2f624742",
    "name": "VanArsdel, Ltd. | Furniture Place - North Dustinside",
    "location": { "lat": 47.3426, "lon": -62.4031 }
  }
]

Voorbeeld 2: Dichtstbijzijnde winkels zoeken naar polygoongeometrie

Met deze query worden maximaal twee winkels gevonden waarvan de locaties elkaar kruisen met een gedefinieerd rechthoekige veelhoek die is gebonden door coördinaten van [-80.0, -75.0] tot [-55.0, -70.0].

De $geoIntersects operator vindt winkels die overlappen met of raken uw veelhoekgrenzen, perfect voor het identificeren van welke locaties interactie hebben met een specifieke geografische zone, ongeacht of ze zich volledig in de zone bevinden of alleen de rand overschrijden.

db.stores.find({
  location: {
    $geoIntersects: {
      $geometry: {
        type: "Polygon",
        coordinates: [[
          [-80.0, -75.0],   // Bottom-left
          [-80.0, -70.0],   // Top-left
          [-55.0, -70.0],   // Top-right
          [-55.0, -75.0],   // Bottom-right
          [-80.0, -75.0]    // Close polygon
        ]]
      }
    }
  }
}, {
  name: 1,
  location: 1,
  city: 1
}).limit(2)

De eerste twee resultaten die door deze query worden geretourneerd.

[
  {
    "_id": "6bba7117-d180-4584-b50c-a2f843e9c9ab",
    "name": "Wide World Importers | Craft Supply Mart - Heaneybury",
    "location": { "lat": -64.4843, "lon": -107.7003 },
    "city": "Heaneybury"
  },
  {
    "_id": "2fd37663-e0ff-41d0-9c5a-3aec86285daa",
    "name": "Relecloud | Cleaning Supply Closet - Patiencehaven",
    "location": { "lat": -70.6077, "lon": -105.9901 },
    "city": "Patiencehaven"
  }
]

Voorbeeld 3: Dichtstbijzijnde winkels zoeken naar geometrie met meerdere veelhoeken

In het voorbeeld worden maximaal twee winkels opgehaald waarvan de locaties binnen een van de twee gedefinieerde rechthoekige regio's (MultiPolygon) vallen: één in de buurt van de coördinaten [120.0, -13.0] tot [125.0, -10.0] en een andere in de buurt van [44.0, -64.0] tot [48.0, -61.0].

Het gebruikt de operator $geoWithin met een multipolygongeometrie om te zoeken naar winkels die zijn ingesloten door een van de opgegeven veelhoeken, waardoor het handig is om tegelijkertijd query's uit te voeren op meerdere niet-aangrenzende geografische gebieden.

db.stores.find({
  location: {
    $geoWithin: {
      $geometry: {
        type: "MultiPolygon",
        coordinates: [
          [[
            [120.0, -13.0],
            [120.0, -10.0],
            [125.0, -10.0],
            [125.0, -13.0],
            [120.0, -13.0]
          ]],
          [[
            [44.0, -64.0],
            [44.0, -61.0],
            [48.0, -61.0],
            [48.0, -64.0],
            [44.0, -64.0]
          ]]
        ]
      }
    }
  }
}, {
  name: 1,
  location: 1
}).limit(2)

De eerste twee resultaten die door deze query worden geretourneerd, zijn:

[
  {
    "_id": "6d70de9c-7b83-426d-81aa-f2173f97b64d",
    "name": "Fabrikam, Inc. | Footwear Haven - Port Erling",
    "location": { "lat": 45.641, "lon": -118.4963 }
  },
  {
    "_id": "96d48224-ce10-4a61-999a-8536d442f81a",
    "name": "Wide World Importers | Eyewear Bazaar - West Oletachester",
    "location": { "lat": 47.3461, "lon": -61.6605 }
  }
]