Utiliser des requêtes géographiques
Utilisez des requêtes géospatiales dans les opérations compatibles avec MongoDB pour interroger les documents qui se trouvent dans une certaine plage à partir d'une longitude et d'une latitude spécifiques.
Avant de commencer
Assurez-vous d'avoir accès à une base de données d'opérations compatible avec MongoDB ou créez-en une et connectez-vous à celle-ci.
Assurez-vous de disposer d'au moins un index 2dsphere ou créez-en un.
Objets GeoJSON
Pour exécuter une requête géospatiale sur les champs de votre collection, les champs sur lesquels vous effectuez la requête doivent être des objets GeoJSON ou des GeoPoints.
Exécuter une requête géospatiale
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 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 par rapport au 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 à au plus 2 000 mètres 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 partitionnement doit être joint à votre requête de recherche par un opérateur $and.
Limites
- Vous ne pouvez pas utiliser les opérateurs
$nearet$textdans la même requête. $nearne peut pas être imbriqué dans une instruction$orà plusieurs clauses, sauf si$nearest la seule expression de la clause$or.$nearne peut pas être utilisé avec les opérateurs$notou$nordans une requête.$nearn'est pas compatible avec les requêtes d'agrégation.