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

Použití vlastnosti objektu jako argumentu $maxDistance v dotazu na geolokaci mongodb

Takto to úplně udělat nemůžete – obecně nemůžete ve svých dotazech MongoDB nic založit na hodnotách ve sbírkách.

Od verze MongoDB 2.4 však podporujeme nový index nazvaný 2dsphere což umožňuje ukládat do databáze nejen body, ale i polygony. Tyto informace byste uložili do dokumentu jako:

db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
    name: "Firestation 1",
    loc: {
        type: "Polygon",
        coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
    }
} );

A pak můžete pomocí dotazu „protínat“ zjistit, zda je bod pokryt každým z polygonů:

db.so.find( {
    'loc' : {  
        $geoIntersects: { 
            $geometry: { type: 'Point', coordinates: [ 0, 0 ] } 
        } 
    }
} );

Což pak vrátí:

{ 
    "_id" : ObjectId("51f24d566775068ab0b786f0"), 
    "name" : "Firestation 1", 
    "loc" : { 
        "type" : "Polygon", 
        "coordinates" : [  [  [  0,  0 ],  [  0,  1 ],  [  1,  1 ],  [  1,  0 ],  [  0,  0 ] ] ] 
    } 
}

Zde najde hasičskou stanici, protože 0, 0 je uprostřed polygonu. Nyní je trik samozřejmě spočítat polygonové body, které tvoří kruh, který je "poloměr" (řekněme 10 km) od středu. Nebudete moci získat skutečný kruh, ale šestiúhelník nebo osmiúhelník by měl stačit. Matematika na to není extrémně jednoduchá, ale http:// www.movable-type.co.uk/scripts/latlong.html#destPoint má příklad v JavaScriptu. Stačí smyčka azimutu v 8 krocích od 0 do 2PI vypočítat body podél obvodu kruhu a umístit je do souřadnic. Ujistěte se, že jste je vložili do dvojitě vnořeného pole a aby první a poslední byly stejné:

{
    name: "Firestation 1",
    loc: {
        type: "Polygon",
        coordinates: [ [
            [ point1-lon, point1-lat ], 
            [ point2-lon, point2-lat ], 
            [ point3-lon, point3-lat ], 
            ...
            [ point1-lon, point1-lat ], 
        ] ]
    }
}



  1. Co jsou základní příkazy MongoDB a jak je používat?

  2. Nelze připojit Robomongo pomocí obrazu dockeru MongoDB

  3. Odstraňování problémů

  4. C# MongoDB Driver – Jak používat UpdateDefinitionBuilder?