Jak implementovat geoprostorové funkce MongoDB

Jak Implementovat Geoprostorove Funkce Mongodb



Geoprostorová funkce MongoDB poskytuje přímý způsob ukládání geografických dat do databáze. V podstatě můžeme geoprostorová data ukládat do MongoDB jako objekty GeoJSON. GeoJSON je bezplatný a open source formát, který závisí na JavaScript Object Notation s jednoduchými geografickými daty. Tato funkce je důležitá pro aplikace, které vyžadují služby založené na poloze, jako je proces mapování, vyhledávání polohy a další. Tento článek popisuje geoprostorovou funkci s ukázkovou implementací.

Přidávání dokumentů do kolekce pro geoprostorové funkce

Abychom demonstrovali funkčnost funkce MongoDB Geospatial, potřebujeme dokumenty pro konkrétní kolekci. Do sbírky „area“ vkládáme několik dokumentů, jak je znázorněno níže:

db.area.insertMany( [
{
název: 'dětský park' ,
umístění: { typ: 'Směřovat' , souřadnice: [ - 60,97 , 30,77 ] },
kategorie: 'Zahrada'
},
{
název: 'Studentská oblast' ,
umístění: { typ: 'Směřovat' , souřadnice: [ - 60,9928 , 30,7193 ] },
kategorie: 'Zahrada'
},
{
název: 'Fotbalové hřiště' ,
umístění: { typ: 'Směřovat' , souřadnice: [ - 60,9375 , 30,8303 ] },
kategorie: 'Stadión'
}
])

Máme dokumenty, které obsahují údaje o poloze, jako jsou souřadnice. Kromě toho vytváříme geoprostorový index na poli, abychom optimalizovali výkon geoprostorových dotazů.









Příklad 1: Použití $geoIntersects Query Operator

Nejprve máme operátor $geoIntersects geoprostorového prvku, který se protíná s poskytnutým objektem. Zvažte následující implementaci operátoru $geoIntersects:



db.area.find({ umístění: { $geoIntersects: { $geometry: { typ: 'Směřovat' ,

souřadnice: [- 60,97 , 30,77 ] } } } })

V příkladu nazýváme kolekci „oblast“ spolu s operací „najít“. Metodě find() předáme sady polí „location“ operátoru dotazu $geoIntersects geoprostorového prvku. To se používá ke kontrole, zda se určený bod protíná s geometrií uloženou v poli geometrie.





Poté operátor $geoIntesects vezme operátor $geometry, kde je pole typu nastaveno na hodnotu „Point“ a pole souřadnic je uvedeno s hodnotami „souřadnic“. Zde je $geometrie definována pro geoprostorové srovnání.

Následující výstup je místo, kde se načte očekávaný dokument a kde pole geometrie obsahuje geometrický objekt, který se protíná se zadaným bodem:



Příklad 2: Použití $near Query Operator

Operátor $near je také geoprostorová funkce, která se používá k provádění geoprostorových dotazů k identifikaci dokumentů, které jsou geograficky blízko daného místa. Načte dokumenty, které jsou uspořádány podle jejich blízkosti k určenému umístění. Zde poskytujeme implementaci operátoru $near:

db.area.find(
{
umístění:
{ $blízko :
{
$geometry: { typ: 'Směřovat' ,  souřadnice: [ - 60,9667 , 30,78 ] },
$minDistance: 1000 ,
$maxDistance: 5000
}
}
}
)

V příkladu definujeme pole „umístění“ kolekce „oblast“ uvnitř operace „najít“. Poté nastavíme operátor dotazu $blízko geoprostorového prvku na toto pole „umístění“. Operátor $near hledá blízký bod se zadanými souřadnicemi bodu. Dále použijeme parametry $minDistance a $maxDistance v operátoru $near, které jsou opatřeny určitými hodnotami k načtení dokumentů v zadaném rozsahu vzdálenosti od daného bodu.

Dokument je načten ve výstupu, který se nachází v blízkosti zadaných míst nebo bodů zájmu v kolekci geoprostorových „oblastí“:

Příklad 3: Použití $nearsphere Query Operator

Alternativně máme operátor $nearsphere, který je podobný operátoru $nearSphere, ale $nearSphere bere při výpočtu vzdáleností v úvahu kulový tvar Země.

db.area.find(
{
umístění: {
$nearSphere: {
$geometry: {
typ: 'Směřovat' ,
souřadnice: [- 60,9667 , 30,78 ]
},
$minDistance: 1000 ,
$maxDistance: 5000
}
}
}
)

V příkladu používáme operátor $nearsphere geoprostorového dotazu. Operátor $nearspehere zde hledá dokument, jehož nejbližší body jsou blízko bodů zadaným v dotazu, a body jsou nastaveny na pole souřadnic.

Poté výsledky upřesníme nastavením parametrů $minDistance a $maxDistance. Parametr $minDistance zajišťuje, že vrácené dokumenty jsou od zadaného bodu vzdáleny alespoň 1000 metrů, zatímco parametr $maxDistance omezuje výsledky na místa, která nejsou dále než 5000 metrů.

Dokument se ve výstupu zobrazí s umístěním v rámci zadaného metru od bodu s danými souřadnicemi:

Příklad 4: Použití operátoru dotazu $geoWithin

Dále máme operátor $geoWithin v MongoDB, který se používá pro geoprostorové dotazy k nalezení dokumentů, které jsou zcela v určeném tvaru, jako je kruh. Ukažme si následující ukázku dotazu $geoWithin:

db.area.find({ umístění:

{ $geoWithin:

{ $centerSphere: [ [ - 60,93414657 , 30,82302903 ], 3 / 3963,2 ] } } })

V příkladu používáme operátor $geoWithin k nalezení dokumentů kolekce „area“ v určité kruhové oblasti na 2D kouli. Za tímto účelem určíme operátor $centerSphere uvnitř operátoru $geoWithin, který vezme dva argumenty jako centrický bod, který zde pravděpodobně představuje bod souřadnic, a poloměr kruhu, který představuje hodnotu vzdálenosti v mílích.

Výsledný dokument je načten následujícím způsobem, který představuje geoprostorový bod, který spadá do kruhu definovaného daným středovým bodem a poloměrem přibližně 3 míle:

Příklad 5: Použití $geoNear Query Operator

Operátor $geoNear je navíc také geoprostorovým operátorem, který se používá pro agregační kanál. Provede geoprostorový dotaz a vrátí dokumenty, které jsou seřazeny podle jejich blízkosti k určenému bodu. Zde jsme uvedli operátor $geoNear, který se volá uvnitř agregačního kanálu.

db.area.aggregate([
{
$geoNear: {
blízko: { typ: 'Směřovat' , souřadnice: [ - 60,99279 , 30,719296 ] },
Pole vzdálenosti: 'dist.kalkulováno' ,
maxDistance: 2 ,
dotaz: { kategorie: 'Zahrada' },
includeLocs: 'dist.location' ,
kulový: pravda
}
}
])

V příkladu zavoláme agregační metodu MongoDB a definujeme v ní operátor $geoNear. Operátor $geoNear má několik parametrů pro určení chování dotazu. Nejprve nastavíme parametr „blízko“, který poskytuje hodnoty „souřadnic“ jako referenční bod pro vyhledávání.

Poté pomocí parametru „distanceField“ specifikujeme poskytnuté pole jako pole výsledku. Toto pole výsledku sady ukládá vzdálenost mezi každým dokumentem a referenčním bodem. Dále definujeme parametr „maxDistance“ s hodnotou „2“, která představuje maximální vzdálenost v metrech.

Poté máme parametr „query“, který filtruje dokumenty podle pole „kategorie“ a bere v úvahu pouze dokumenty, kde je „kategorie“ „Parky“. Poté zavoláme parametr „includeLocs“, který obsahuje informace o umístění. Nakonec specifikujeme parametr „spherical“ s hodnotou „true“, která vypočítá vzdálenosti pomocí 2D sférického souřadnicového systému.

Agregační kanál představuje dokument ve výstupu, který odpovídajícím způsobem zobrazuje informace proti parametru. Následující pole „dist.calculated“ zobrazuje vzdálenost každého dokumentu od referenčního bodu:

Závěr

Dozvěděli jsme se, že geoprostorové schopnosti MongoDB nám pomáhají efektivně zpracovávat a dotazovat se na informace založené na poloze. Naučili jsme se implementaci geoprostorové funkce pomocí různých operátorů s ukázkovým programem. Máme mnohem více funkcí a metod, které jsou také přínosné pro širokou škálu aplikací.