Kaip įdiegti „MongoDB“ geografines funkcijas

Kaip Idiegti Mongodb Geografines Funkcijas



Geografinė „MongoDB“ funkcija suteikia paprastą būdą saugoti geografinius duomenis duomenų bazėje. Iš esmės geografinius duomenis galime saugoti MongoDB kaip GeoJSON objektus. GeoJSON yra nemokamas atvirojo kodo formatas, kuris priklauso nuo JavaScript Object Notation su paprastais geografiniais duomenimis. Ši funkcija svarbi programoms, kurioms reikalingos paslaugos pagal vietą, pvz., atvaizdavimo procesas, vietos paieška ir kt. Šiame straipsnyje aptariama geoerdvinė funkcija su įgyvendinimo pavyzdžiu.

Dokumentų įtraukimas į geoerdvinių savybių kolekciją

Norėdami parodyti MongoDB geoerdvinės funkcijos funkcionalumą, mums reikia konkrečios kolekcijos dokumentų. Į kolekciją „sritis“ įterpiame kelis dokumentus, kaip parodyta toliau:

db.area.insertMany( [
{
vardas: 'Vaikų parkas' ,
vieta: { tipas: 'Taškas' , koordinatės: [ - 60,97 , 30.77 ] },
Kategorija: 'Sodas'
},
{
vardas: 'Studentų zona' ,
vieta: { tipas: 'Taškas' , koordinatės: [ - 60.9928 , 30.7193 ] },
Kategorija: 'Sodas'
},
{
vardas: 'Futbolo aikštelė' ,
vieta: { tipas: 'Taškas' , koordinatės: [ - 60,9375 , 30.8303 ] },
Kategorija: 'Stadionas'
}
] )

Turime dokumentus, kuriuose yra vietos duomenys, pvz., koordinatės. Be to, lauke sukuriame geoerdvinį indeksą, kad optimizuotume geoerdvinių užklausų našumą.









1 pavyzdys: $geoIntersects užklausos operatoriaus naudojimas

Pirma, turime geoerdvinės funkcijos operatorių $geoIntersects, kuris susikerta su pateiktu objektu. Apsvarstykite šį operatoriaus $geoIntersects įgyvendinimą:



db.area.find({ vieta: { $geoIntersects: { $geometry: { type: 'Taškas' ,

koordinatės: [ - 60,97 , 30.77 ] } } } })

Pavyzdyje mes vadiname rinkinį „sritis“ kartu su operacija „rasti“. Metodui find() perduodame „vietos“ laukų rinkinius geoerdvinės funkcijos $geoIntersects užklausos operatoriui. Tai naudojama norint patikrinti, ar nurodytas taškas kertasi su geometrija, kuri yra saugoma geometrijos lauke.





Tada operatorius $geoIntesects paima operatorių $geometry, kur tipo laukas nustatomas su 'Taško' reikšme, o koordinačių laukas pateikiamas su 'koordinačių' reikšmėmis. Čia geoerdviniam palyginimui apibrėžiama $geometrija.

Ši išvestis yra vieta, kur gaunamas laukiamas dokumentas, o geometrijos lauke yra geometrinis objektas, susikertantis su nurodytu tašku:



2 pavyzdys: $near užklausos operatoriaus naudojimas

Operatorius $near taip pat yra geoerdvinė funkcija, naudojama geografinėms užklausoms atlikti, siekiant identifikuoti dokumentus, kurie yra geografiškai arti tam tikros vietos. Jis nuskaito dokumentus, kurie yra išdėstyti pagal jų artumą nurodytai vietai. Čia pateikiame operatoriaus $near įgyvendinimą:

db.area.find(
{
vieta:
{ $netoli :
{
$geometry: { tipas: 'Taškas' , koordinatės: [ - 60.9667 , 30.78 ] },
$minAtstumas: 1000 ,
$maksimalus atstumas: 5000
}
}
}
)

Pavyzdyje apibrėžiame kolekcijos „sritis“ lauką „vieta“ operacijos „rasti“ viduje. Tada mes nustatome geoerdvinės funkcijos $near užklausos operatorių į tą „vietos“ lauką. Operatorius $near ieško artimo taško su nurodytu koordinačių tašku. Toliau mes naudojame parametrus $minDistance ir $maxDistance operatoriaus $near, kuriems suteikiamos tam tikros reikšmės, kad gautume dokumentus nurodytu atstumu nuo nurodyto taško.

Dokumentas paimamas išvestyje, esančiame netoli nurodytų vietų arba lankytinų vietų geoerdvinėje „srities“ kolekcijoje:

3 pavyzdys: $nearsphere užklausų operatoriaus naudojimas

Arba turime operatorių $nearsphere, kuris yra panašus į $near operatorių, tačiau $nearSphere skaičiuodamas atstumus atsižvelgia į Žemės rutulio formą.

db.area.find(
{
vieta: {
$nearSphere: {
$geometry: {
tipas: 'Taškas' ,
koordinatės: [- 60.9667 , 30.78 ]
},
$minAtstumas: 1000 ,
$maksimalus atstumas: 5000
}
}
}
)

Pavyzdyje naudojame geoerdvinės užklausos operatorių $nearsphere. Operatorius $nearspehere čia ieško dokumento, kurio artimiausi taškai yra arti užklausoje nurodytų taškų, o taškai nustatomi į koordinačių lauko masyvą.

Po to patobuliname rezultatus nustatydami $minDistance ir $maxDistance parametrus. Parametras $minDistance užtikrina, kad grąžinami dokumentai būtų bent 1000 metrų atstumu nuo nurodyto taško, o parametras $maxDistance apriboja rezultatus iki vietų, kurios yra ne toliau kaip 5000 metrų.

Dokumentas rodomas išvestyje su vieta per nurodytą metrą nuo taško su nurodytomis koordinatėmis:

4 pavyzdys: $geoWithin užklausos operatoriaus naudojimas

Be to, MongoDB turime operatorių $geoWithin, kuris naudojamas geoerdvinėms užklausoms, siekiant rasti dokumentus, visiškai atitinkančius tam tikrą formą, pvz., apskritimą. Pateikiame $geoWithin užklausos demonstraciją:

db.area.find({ vieta:

{ $geoWithin:

{ $centerSphere: [ [ - 60.93414657 , 30.82302903 ], 3 / 3963,2 ] } } })

Pavyzdyje mes naudojame operatorių $geoWithin, kad surastume rinkinio „sritis“ dokumentus tam tikroje apskritoje 2D sferos srityje. Tam nurodome operatorių $centerSphere operatoriaus $geoWithin viduje, kuris abu argumentus laiko centriniu tašku, kuris čia greičiausiai reiškia koordinačių tašką, ir apskritimo spindulį, kuris reiškia atstumo vertę myliomis.

Gautas dokumentas paimamas taip, kaip nurodyta geoerdviniame taške, kuris patenka į apskritimą, kurį apibrėžia nurodytas centrinis taškas ir maždaug 3 mylių spindulys:

5 pavyzdys: $geoNear užklausos operatoriaus naudojimas

Be to, operatorius $geoNear taip pat yra geoerdvinis operatorius, naudojamas agregavimo dujotiekiui. Jis atlieka geoerdvinę užklausą ir grąžina dokumentus, surūšiuotus pagal jų artumą nurodytam taškui. Čia mes suteikėme operatorių $geoNear, kuris vadinamas agregavimo dujotiekio viduje.

db.area.aggregate([
{
$geoNear: {
šalia: { tipas: 'Taškas' , koordinatės: [ - 60.99279 , 30.719296 ] },
distanceField: 'atst.apskaičiuota' ,
maksimalus atstumas: 2 ,
užklausa: { kategorija: 'Sodas' },
includeLocs: 'dist.location' ,
sferinis: tiesa
}
}
])

Pavyzdyje mes iškviečiame MongoDB agregavimo metodą ir jame apibrėžiame $geoNear operatorių. Operatorius $geoNear yra nustatytas su keliais parametrais, kad būtų nurodyta užklausos elgsena. Pirmiausia nustatome parametrą „beveik“, kuris pateikia „koordinačių“ reikšmes kaip atskaitos tašką paieškai.

Tada mes naudojame parametrą „distanceField“, kad nurodytume pateiktą lauką kaip rezultato lauką. Šiame rinkinio rezultatų lauke saugomas atstumas tarp kiekvieno dokumento ir atskaitos taško. Toliau apibrėžiame parametrą „maxDistance“ su „2“ reikšme, kuri reiškia didžiausią atstumą metrais.

Po to turime parametrą „query“, kuris filtruoja dokumentus pagal lauką „kategorija“ ir atsižvelgia tik į tuos dokumentus, kurių „kategorija“ yra „Parkai“. Tada iškviečiame parametrą „includeLocs“, kad būtų pateikta vietos informacija. Galiausiai nurodome „sferinį“ parametrą su „tikrąja“ verte, kuri apskaičiuoja atstumus naudojant 2D sferinę koordinačių sistemą.

Sumavimo konvejeris parodo dokumentą išvestyje, kuriame atitinkamai rodoma parametro informacija. Šiame lauke „dist.calculated“ rodomas kiekvieno dokumento atstumas nuo atskaitos taško:

Išvada

Sužinojome, kad MongoDB geoerdvinės galimybės padeda efektyviai tvarkyti ir pateikti užklausas pagal vietą. Su pavyzdine programa išmokome geoerdvinės funkcijos diegimą naudodami įvairius operatorius. Turime daug daugiau funkcijų ir metodų, kurie taip pat naudingi įvairioms programoms.