sql >> Databasteknik >  >> NoSQL >> MongoDB

Vad är skillnaden mellan $near och $nearSphere i Mongo?

Nyckelordet är sphere för att skilja mellan $near och $nearSphere .

Som du vet, $nearSphere anges beräkna avstånd med hjälp av sfärisk geometri. Detta är relaterat till jordens kartprojektion (förvrängning ). Där MongoDB 2d indexerar är baserad på kartesiska och MongoDB 2dsphere-index är baserad på Geodesic .

Nog med teori, låt oss ta några exempel. Låt oss säga att vi har två dokument enligt nedan:

db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });

Manualen för båda operatörerna anger att vi kan använda:

Index:2dsphere , Fråga: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 ]}}}});

I det här fallet kommer båda frågorna att returnera samma resultat, eftersom indexet är lagrat i 2dsphere .

Resultat:

[ /* $nearSphere */
    {"_id" : "Westfield London"},
    {"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
    {"_id" : "Westfield London"},
    {"_id" : "Green Lanes Shopping Centre"}
]

Index:2d , Fråga:äldre koordinater

db.map.createIndex({"location": "2d"});

db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});

db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});

Det är här skillnaden sker, resultatet för $nearSphere beräknas sfäriskt trots indexet, medan $near beräknas i platt projektion.

Resultat:

[ /* $nearSphere */
    {"_id" : "Westfield London"},
    {"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
    {"_id" : "Green Lanes Shopping Centre"},
    {"_id" : "Westfield London"}
]

Se Gist:JS test script av exemplet ovan. Detta testades med MongoDB v3.4.4.

Se även Geospatiala index och frågor .




  1. MongoDb Distinkt med frågan C#-drivrutin

  2. Varför säkerhetskopierar mongodump inte index?

  3. mongodb vägrar anslutning i python

  4. Azure CosmosDB med Mongo-drivrutiner:Få Count Utan att hämta alla dokument baserade på element i underdokument i C#.Net