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

Brug af en objektegenskab som argumentet $maxDistance i en mongodb geolocation-forespørgsel

Du kan ikke helt gøre dette sådan her - generelt kan du ikke basere noget i dine MongoDB-forespørgsler på værdier i samlingerne.

Men siden MongoDB 2.4 understøtter vi et nyt indeks kaldet 2dsphere som giver dig mulighed for at gemme ikke kun punkter i databasen, men også polygoner. Du vil gemme disse oplysninger i et dokument som:

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 ] ] ]
    }
} );
 

Og så kan du bruge en "skærende" forespørgsel til at finde ud af, om et punkt er dækket af hver af polygonerne:

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

Som så returnerer:

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

Her finder den brandstationen, fordi 0, 0 er i midten af ​​polygonen. Nu er kunsten selvfølgelig at beregne polygonpunkterne, der udgør en cirkel, der er "radius" (f.eks. 10 km) væk fra midtpunktet. Du vil ikke kunne få en rigtig cirkel, men en sekskant eller ottekant burde være god nok. Matematikken til det er ikke ekstremt simpel, men http:// www.movable-type.co.uk/scripts/latlong.html#destPoint har et eksempel i JavaScript. Bare løkke din pejling i 8 trin fra 0 til 2PI for at beregne punkterne langs cirklens omkreds, og sæt dem i koordinaterne. Sørg for at integrere dem i et dobbelt indlejret array og gør den første og den sidste ens:

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


  1. MongoDB advarsler om udfasning ved brug af Mongoose

  2. Hvordan tilføjer jeg en admin-bruger til Mongo i 2.6?

  3. pymongo.errors.ConnectionFailure:kunne ikke oprette forbindelse til localhost:27017:[Errno 111] Forbindelse afvist

  4. Hvordan får man den nye værdi tilbage efter en opdatering i et indlejret array?