sql >> Databáze >  >> NoSQL >> MongoDB

Jaký je v Mongo rozdíl mezi $near a $nearSphere?

Klíčové slovo je sphere rozlišovat mezi $near a $nearSphere .

Jak víte, $nearSphere je uvedeno pro výpočet vzdálenosti pomocí sférické geometrie. To souvisí s projekcí mapy Země (zkreslení ). Kde indexy MongoDB 2d je založeno na kartézštině a indexy MongoDB 2dsphere je založeno na Geodesic .

Dost teorie, použijeme několik příkladů. Řekněme, že máme dva níže uvedené dokumenty:

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

Manuál pro oba operátory uvádí, že můžeme použít:

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

V tomto případě oba dotazy vrátí stejný výsledek, protože index je uložen v 2dsphere .

Výsledek:

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

Index:2d , dotaz:starší souřadnice

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

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

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

Zde dochází k rozdílu, což je výsledek pro $nearSphere se počítá sféricky navzdory indexu, zatímco $near se počítá v ploché projekci.

Výsledek:

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

Viz shrnutí:testovací skript JS z výše uvedeného příkladu. Toto bylo testováno pomocí MongoDB v3.4.4.

Viz také Geoprostorové indexy a dotazy .




  1. Vytváření indexů v MongoDB s ovladačem .NET 2.0

  2. Dotazování na velikost vnitřního pole v MongoDB

  3. mongodb db.collection.find({}) nedělá nic za .limit(101)

  4. Aktualizujte/odstraňte dílčí dokument v mongodb pomocí ovladače C#