MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Dans Mongo, quelle est la différence entre $near et $nearSphere ?

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 :

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 .