sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan får man alle cirkler, som et punkt er indeholdt i?

Det er muligt at bruge MongoDB's $geoIntersects Geospatial forespørgselsoperator.

Så hvis du har en samling af GeoJson-polygoner, og du vil finde ud af alle de polygoner, der skærer dit givne punkt, så skal du køre følgende:

db.places.find( { <locationFieldOfYourDocuments> :
                  { $geoIntersects :
                    { $geometry :
                      { type : "Point" ,
                        coordinates: [long, lat]
                } } } } )

I kommandoen ovenfor, loc er den attribut for hvert dokument, der indeholder koordinaterne for GeoJson polygon. Sørg også for, at du har 2dsphere indeks over <locationFieldOfYourDocuments> .

Nu, for at få løst dit oprindelige problem, vil jeg bruge en lille smule javascript. Der kan være bedre løsninger, men ikke efter min viden.

Lad os sige, at alle dine cirkler er gemt i Circles kollektion. Jeg ville forespørge på den samling og hente hver cirkel en efter en og derefter udføre en skæring med en anden samling, der ville indeholde et enkelt punkt, som ville være det, du ville forespørge på, om det skærer med cirklerne eller ej. Så lad punktet gemmes i SinglePoint samling.

Scriptet ville se ud som...

db.Intersections.remove({}); // emptying the output collection
var circleCursor = db.Circles.find();
while (circleCursor.hasNext()) {
    var circle = circleCursor.next();
    var coord = circle.location;
    var radiusInRadians = circle.radius * conversionFactorForRadius;
    var intersect = db.SinglePoint.find({loc :
                                         { $geoWithin :
                                           {$centerSphere : [coord], radiusInRadians}
                                         }});
    if (intersect.hasNext()) {db.Intersections.add(circle)} // this will add all intersecting circles to Intersections collection
}

Alt du skal gøre er at gemme dette script i en fil (myScript.js) og foretage et opkald:

mongo DBName pathTomyScript.js

Dette vil gemme alle de cirkler, der krydser dit inputpunkt i Intersects-samlingen. Alle ovenstående samlinger skal være i DBName-databasen.




  1. Sådan skriver du følgende mongo-opslagsforespørgsel i Yii2

  2. Spring RedisConnectionFactory med transaktion, der ikke returnerer forbindelse til Pool og blokerer derefter, når den er opbrugt

  3. Azure VM opretter ikke forbindelse til Azure Redis Cache, men lokalt opretter forbindelse til Azure Redis Cache

  4. hvordan gør man en variabel til en unik nøgle i mongoose?