Utiliser la recherche géospatiale

Utilisez des requêtes géospatiales dans des opérations compatibles avec MongoDB pour interroger des documents qui se trouvent dans une certaine plage à partir d'une longitude et d'une latitude spécifiques.

Avant de commencer

  1. Assurez-vous d'avoir accès à une base de données d'opérations compatible avec MongoDB existante ou créez-en une et connectez-vous à celle-ci.

  2. Assurez-vous d'avoir au moins un index 2dsphere ou créez-en un.

Objets GeoJSON

Pour exécuter une requête géospatiale sur des champs de votre collection, les champs que vous interrogez doivent être des objets GeoJSON ou des GeoPoints.

Vous pouvez effectuer une requête géospatiale à l'aide de l'opérateur $near, qui calcule la distance d'un point géographique par rapport aux points géographiques des documents. Ces documents sont ensuite triés du plus proche au plus éloigné dans les résultats de la requête. Vous pouvez également remplacer cet ordre de tri en définissant un tri secondaire, autre que $natural, dans votre requête. L'opérateur $near doit exister dans un champ de document du filtre de requête et doit contenir un champ GeoJSON $geometry.

Dans l'exemple suivant, l'opérateur $near est utilisé pour calculer la distance entre le point géographique (-122.084, 37.4221) et les points géographiques situés dans le champ location de tous les documents de myCollection. Les documents sont renvoyés et classés par ordre de distance croissante entre les deux points.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

Vous pouvez également utiliser les champs facultatifs $maxDistance et $minDistance pour contrôler la distance en mètres à partir du point de votre requête. L'exemple suivant montre une requête dans laquelle les documents renvoyés doivent se trouver à au moins 500 mètres et à 2 000 mètres au maximum du point (-122.084, 37.4221) :

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

Si votre index est partitionné, vous pouvez filtrer en fonction de la partition en l'incluant dans un filtre d'égalité "and" dans votre requête. Par exemple, si vous aviez une partition region et que vous souhaitiez filtrer les résultats de votre requête par région midwest, vous pouvez procéder comme suit :

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

La valeur de votre partition doit être une chaîne. Votre filtre de partition doit être joint à votre requête de recherche par un opérateur $and.

Limites

  • Les opérateurs $near et $text ne peuvent pas être utilisés dans la même requête.
  • $near ne peut pas être imbriqué dans une instruction $or à plusieurs clauses, sauf si $near est la seule expression de la clause $or.
  • $near ne peut pas être utilisé avec les opérateurs $not ou $nor dans une requête.
  • $near n'est pas compatible avec les requêtes d'agrégation.