Partager via


$geometry

L’opérateur $geometry spécifie un objet geometry GeoJSON pour les requêtes géospatiales. Il est utilisé dans d’autres opérateurs géospatiaux pour définir des formes et des points pour les calculs spatiaux.

Syntaxe

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

Paramètres

Paramètre Descriptif
type Type d’objet GeoJSON (Point, Polygon, MultiPolygon, etc.)
coordinates Coordonnées définissant l’objet GeoJSON en tant que tableau

Examples

Comprenons l’utilisation avec un exemple json à partir du jeu de données stores.

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

Exemple 1 : Rechercher les magasins les plus proches pour pointer la géométrie

Pour de meilleures performances, commencez par créer l’index requis 2dsphere .

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

La requête récupère jusqu’à deux magasins les plus proches du point aux coordonnées [46.2917, -62.6354], ordonnées par proximité. Il utilise l’opérateur $near pour trier les résultats à distance à partir d’un point spécifique, ce qui permet de trouver les magasins les plus proches d’un emplacement donné.

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

Les deux premiers résultats retournés par cette requête sont les suivants :

[
  {
    "_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 }
  }
]

Exemple 2 : Rechercher les magasins les plus proches de la géométrie des polygones

Cette requête recherche jusqu’à deux magasins dont les emplacements se croisent avec un polygone rectangulaire défini délimité par des coordonnées de [-80.0, -75.0] à [-55.0, -70.0].

L’opérateur $geoIntersects trouve des magasins qui se chevauchent ou touchent vos limites de polygones, parfaits pour identifier les emplacements qui interagissent avec une zone géographique spécifique, qu’ils soient entièrement à l’intérieur ou simplement à travers le bord.

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)

Les deux premiers résultats retournés par cette requête.

[
  {
    "_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"
  }
]

Exemple 3 : Rechercher les magasins les plus proches de la géométrie multi polygone

L’exemple récupère jusqu’à deux magasins dont les emplacements se trouvent dans l’une des deux régions rectangulaires définies (MultiPolygon) : l’une près des coordonnées [120.0, -13.0] à [125.0, -10.0], et une autre près de [44.0, -64.0] à [48.0, -61.0].

Il utilise l’opérateur $geoWithin avec une géométrie MultiPolygon pour rechercher des magasins placés entre les polygones spécifiés, ce qui permet d’interroger simultanément plusieurs zones géographiques nonadjacentes.

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)

Les deux premiers résultats retournés par cette requête sont les suivants :

[
  {
    "_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 }
  }
]