Le mot-clé est sphere
pour différencier $near
et $nearSphere
.
Comme vous le savez, $nearSphere
est indiqué pour calculer la distance en utilisant la géométrie sphérique. Ceci est lié à la projection cartographique
de la Terre (distorsion
). Où index MongoDB 2d
est basé sur cartésien
et index MongoDB 2dsphere
est basé sur géodésique
.
Assez de théorie, prenons quelques exemples. Disons que nous avons deux documents comme ci-dessous :
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
Le manuel des deux opérateurs précise que l'on peut utiliser :
2dsphere
index pour les données de localisation définies comme GeoJSON points2d
index pour les données de localisation définies comme paires de coordonnées héritées
Index :2dsphere , Requête :GeoJSON
db.map.createIndex({"location": "2dsphere"});
db.map.find({"location":{"$nearSphere":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ] }}}});
db.map.find({"location":{"$near":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ]}}}});
Dans ce cas, les deux requêtes renverront le même résultat, car l'index est stocké dans 2dsphere
.
Résultat :
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Index :2d , Requête :Coordonnées héritées
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
C'est là que la distinction se produit, le résultat pour $nearSphere
est calculé de manière sphérique malgré l'indice, tandis que $near
est calculé en projection plane.
Résultat :
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Voir essentiel :script de test JS de l'exemple ci-dessus. Cela a été testé avec MongoDB v3.4.4.
Voir également Index et requêtes géospatiaux .