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
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.
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.
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 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
$nearet$textne peuvent pas être utilisés dans 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.