sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur får man alla cirklar som en punkt finns i?

Det är möjligt att använda MongoDB:s $geoIntersects Geospatial frågeoperator.

Så om du har en samling GeoJson-polygoner och du vill ta reda på alla polygoner som skär din givna punkt, måste du köra följande:

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

I kommandot ovan, loc är det attribut för varje dokument som innehåller koordinaterna för GeoJson polygon. Se också till att du har 2dsphere indexera över <locationFieldOfYourDocuments> .

Nu, för att få ditt ursprungliga problem löst kommer jag att använda lite javascript. Det kan finnas bättre lösningar men inte vad jag vet.

Låt oss säga att alla dina cirklar är lagrade i Circles samling. Jag skulle fråga den samlingen och hämta varje cirkel en efter en och sedan utföra en skärning med en annan samling som skulle innehålla en enda punkt som skulle vara den du ville fråga om den skär med cirklarna eller inte. Så låt punkten lagras i SinglePoint samling.

Manuset skulle se ut 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
}

Allt du behöver göra är att spara det här skriptet i en fil (myScript.js) och ringa ett samtal:

mongo DBName pathTomyScript.js

Detta kommer att lagra alla cirklar som korsar din inmatningspunkt i Intersects-samlingen. Alla ovanstående samlingar bör finnas i databasen DBName.




  1. MongodDB $dra bara ett element från arrayen

  2. Hur du säkrar dina Open Source-databaser med ClusterControl

  3. $addToSet till en array men det ger mig null

  4. Svara huvudinformation och lägg till extraktarray till samma resultat