π‘ λ³Έ λ¬Έμλ MongoDB 곡μ λ©λ΄μΌμ λμμλ 'Geospatial 쿼리'λ₯Ό λ²μν΄λμ κΈμ λλ€.
MongoDB λ geospatial data μ λν 쿼리 μ°μ°μ μ§μν©λλ€. μ΄ μΉμ μ MongoDB μ geospatial κΈ°λ₯λ€μ λν΄ μκ°ν©λλ€.
1. Geospatial Data (μ§λ¦¬κ³΅κ° λ°μ΄ν°)
MongoDB μμ GeoJSON κ°μ²΄λ legacy coordinates pairs (λ κ±°μ μ’ν μ) λ‘ geospatial data λ₯Ό μ μ₯ν μ μμ΅λλ€.
1.1 GeoJSON Objects (GeoJSON κ°μ²΄)
μ§κ΅¬μ κ°μ ꡬ μμμ geometry λ₯Ό κ³μ°νκΈ° μν΄μ , μμΉ λ°μ΄ν°λ₯Ό GeoJSON κ°μ²΄ ννλ‘ μ μ₯ν΄μΌ ν©λλ€. GeoJSON data λ₯Ό λͺ μνκΈ° μν΄ μλμ κ°μ 쑰건과 ν¨κ» embedded document λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
- GeoJSON type : GeoJSON object type (Point, Polygon, MultiPoint λ±λ±..) μ λͺ
μν©λλ€.
- Point (MongoDB 2.4 μ΄μ)
- LineString (MongoDB 2.4 μ΄μ)
- Polygon (MongoDB 2.4 μ΄μ)
- MultiPoint (MongoDB 2.6 μ΄μ)
- MultiLineString (MongoDB 2.6 μ΄μ)
- MultiPolygon (MongoDB 2.6 μ΄μ)
- GeometryCollection (MongoDB 2.6 μ΄μ)
- coordinates : κ°μ²΄μ μ’νλ₯Ό λͺ
μν©λλ€. λ§μ½ μλμ κ²½λ μ’νλ₯Ό μ§μ νλ κ²½μ°μ [κ²½λ, μλ] μ μμκ° λ§μ΅λλ€.
- κ²½λ κ° λ²μ: -180 <= x <= 180 ( 0 : 그리λμΉ μ²λ¬Έλ(λ°λ), - : μμͺ½, + : λμͺ½ )
- μλ κ° λ²μ: -90 <= y <= 90 ( 0 : μ λ, -90 : λ¨κ·Ή, +90 : λΆκ·Ή )
μλ₯Όλ€μ΄ GeoJSON Point λ₯Ό λͺ μνλ€λ©΄ μλμ κ°μ΅λλ€.
location: {
type: "Point",
coordinates: [-73.856077, 40.848447]
}
- MongoDBμμ μ§μνλ GeoJSON κ°μ²΄ λͺ©λ‘κ³Ό μμλ GeoJSON objects μμ λ³Ό μ μμ΅λλ€.
1.2 Legacy Coordinate Pairs (λ κ±°μ μ’ν μ)
Euclidean plane(μ ν΄λ¦¬λ νλ©΄) μμμ 거리λ₯Ό κ³μ°νκΈ° μν΄μ μμΉ λ°μ΄ν°λ₯Ό Legacy Coordinate Pairsλ‘ μ μ₯νκ³ 2d indexλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. MongoDBλ λ°μ΄ν°λ₯Ό GeoJSON Point νμ μΌλ‘ λ³ννμ¬ 2dsphere index λ₯Ό ν΅ν΄ legacy coordinate paris μμ ꡬ면 κ³μ°μ μ§μν©λλ€.
λ°μ΄ν°λ₯Ό legacy coordinate paris λ‘ λͺ μνλ λ°©λ²μλ λ°°μ΄μ μ¬μ©νκ±°λ embedded document λ₯Ό μ¬μ© ν μ μμ΅λλ€. (λ°°μ΄ μ¬μ©μ μΆμ²)
λ°°μ΄μ ν΅ν λͺ μ (μΆμ²):
<field>: [ <x>, <y> ]
λ§μ½ μλμ κ²½λ μ’νλ₯Ό λͺ μνλ€λ©΄, κ²½λλ₯Ό λ¨Όμ μ°κ³ μλλ₯Ό κ·Έλ€μμ μμ±ν©λλ€.
<field>: [<longitude>, <latitude> ]
- κ²½λ κ° λ²μλ -180 ~ 180
- μλ κ° λ²μλ -90 ~ 90
embedded document λ₯Ό ν΅ν λͺ μ:
<field>: { <field1>: <x>, <field2>: <y> }
λ§μ½ μλμ κ²½λ μ’νλ₯Ό λͺ μνλ€λ©΄, 첫λ²μ§Έ νλμλ νλ μ΄λ¦μ μκ΄μμ΄ κ²½λ κ°μ, λλ²μ§Έ νλμ μλ κ°μ λ£μ΄μΌ ν©λλ€.
<field>: { <field1>: <longitude>, <field2>: <latitude> }
- κ²½λ κ° λ²μλ -180 ~ 180
- μλ κ° λ²μλ -90 ~ 90
legacy coordinate pairs λ₯Ό λͺ μνλ λκ°μ§ λ°©λ² μ€μμ, embedded document λ₯Ό ν΅ν λ°©λ²μ λͺλͺ μΈμ΄μμ associative map ordering μ΄ λ³΄μ₯λμ§ μμ΅λλ€. λ°λΌμ λ°°μ΄μ ν΅ν λ°©λ²μ μΆμ²ν©λλ€.
2. Geospatial Indexes (μ§λ¦¬κ³΅κ° μΈλ±μ€)
MongoDB λ geospatial queries λ₯Ό μ§μνκΈ° μν΄ λ€μκ³Ό κ°μ geospatial index νμ λ€μ μ 곡ν©λλ€.
2.1 "2dsphere"
2dsphere index λ μ§κ΅¬μ κ°μ ꡬμμ geometry λ₯Ό κ³μ°νλ 쿼리λ€μ μ§μν©λλ€. 2dsphere index λ₯Ό μμ±νκΈ° μν΄μ db.collection.createIndex() ν¨μλ₯Ό μ¬μ©νκ³ μΈλ±μ€ νμ μ "2dsphere" λΌκ³ λͺ μν΄μΌ ν©λλ€
db.collection.createIndex( { <location field> : "2dsphere" } )
- <location field>: GeoJSON κ°μ²΄ νΉμ legacy coordinate paris λ₯Ό κ°μΌλ‘ κ°μ§ μ μλ νλμ λλ€.
- "2dsphere": 2dsphere index μ λν μ 보λ 2dsphere Indexes μμ λ³Ό μ μμ΅λλ€.
2.2 "2d"
2d index λ 2μ°¨μ νλ©΄μμμμ geometry λ₯Ό κ³μ°νλ 쿼리λ₯Ό μ§μν©λλ€. λΉλ‘ μ΄ μΈλ±μ€κ° ꡬ체 μμμ κ³μ°νλ μΏΌλ¦¬μΈ $nearSphereλ₯Ό μ§μ κ°λ₯νμ§λ§, ꡬμ κ΄λ ¨λ 쿼리 μ¬μ©μμλ 2dsphere index λ₯Ό μ¬μ©νλκ² μ’μ΅λλ€. 2d index λ₯Ό μμ±νκΈ° μν΄μ , db.collection.createIndex() ν¨μλ₯Ό μ¬μ©νκ³ , μΈλ±μ€ νμ μ "2d" λΌκ³ λͺ μν΄μΌ ν©λλ€ :
db.collection.createIndex( { <location field> : "2d" } )
- <location field>: legacy coordinate paris λ₯Ό κ°μΌλ‘ κ°λ νλμ λλ€.
- "2d": 2d index μ λν μ 보λ 2d Indexes μμ λ³Ό μ μμ΅λλ€.
2.3 Geospatial Indexes and Sharded Collections (μ§λ¦¬κ³΅κ° μΈλ±μ€μ μ€λ©λ μ½λ μ )
μ½λ μ μ μ€λ©ν λ geospatial index λ₯Ό μ€λν€ λ‘ μ¬μ©ν μ μμ΅λλ€. κ·Έλ¬λ μ€λν€κ° μλ λ€λ₯Έ νλλ₯Ό μ¬μ©ν΄ μ€λ©λ μ½λ μ μ geospatial index λ₯Ό μμ±ν μ μμ΅λλ€.
λ€μκ³Ό κ°μ geospatial μ°μ°λ€μ μ€λ©λ μ½λ μ μμ μ§μλ©λλ€.
- $geoNear aggregation stage
- $near and $nearSphere query operators (starting in MongoDB 4.0)
MongoDB 4.0 λΆν° $near / $nearSphere μΏΌλ¦¬κ° μ€λ©λ μ½λ μ μμ μ§μλ©λλ€. 4.0 μ΄μ λ²μ μμλ ν΄λΉ 쿼리λ€μ΄ μ§μλμ§ μμ΅λλ€. λμ μ€λ ν΄λ¬μ€ν° μ©μΌλ‘ $geoNear aggregation stage νΉμ geoNear command λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. (4.0 & μ΄ν λ²μ μμ μ¬μ© κ°λ₯) λν $geoWithin / $geoIntersect λ₯Ό μ΄μ©ν΄ μ€λ ν΄λ¬μ€ν°μ λν geospatial data λ₯Ό 쿼리ν μ μμ΅λλ€.
2.4 Covered Queries
Geospatial indexes λ covered query κ° λ μ μμ΅λλ€. (covered query? : 쿼리μ 쑰건μ΄λ νλ‘μ μ μ΄ μΈλ±μ€λ νλλ§ ν¬ν¨ν΄μ λ€λ₯Έ document λ₯Ό μ€μΊνκ±°λ κ°μ Έμ¬ νμκ° μλ 쿼리)
3. Geospatial Queries (μ§λ¦¬κ³΅κ° 쿼리)
NOTE: ꡬ체μ λν 쿼리μλ 2dsphere index κ²°κ³Όκ°μ μ¬μ©νμΈμ. μκ·Ήμ κ°μΈλ ꡬνμ λν 쿼리μ 2d index λ₯Ό μ¬μ©νλ κ²μ μλͺ»λ κ²°κ³Όκ°μ΄ λμ¬ μ μμ΅λλ€.
MongoDB μ GeoJSON κ°μ²΄μ λν geospatial queries λ ꡬμμ κ³μ°λκΈ°μ 2dsphere indexλ₯Ό μ¬μ©νλ κ²μ κΆμ₯ν©λλ€. λν MongoDB μ geospatial queries λ WGS84 μ°Έμ‘° μμ€ν μ μ¬μ©ν©λλ€.
3.1 Geospatial Query Operators (μ§λ¦¬κ³΅κ° 쿼리 μ°μ°μ)
MongoDB λ μλμ κ°μ geospatial query μ°μ°μλ€μ μ§μν©λλ€ :
Name | Description |
$geoIntersects | GeoJSON geometry μ κ΅μ°¨νλ geometries λ₯Ό μ νν©λλ€. 2dsphere index λ $geoIntersects λ₯Ό μ§μν©λλ€. |
$geoWithin | GeoJSON geometry μμ μνλ geometries λ₯Ό μ νν©λλ€. 2dsphere index μ 2d index λͺ¨λ $geoWithin μ μ§μν©λλ€. |
$near | μ κ³Ό κ°κΉμ΄ μμμ geospatial objects λ₯Ό λ°νν©λλ€. geospatial index κ° νμνλ©° 2dsphere index μ 2d index λͺ¨λ $near λ₯Ό μ§μν©λλ€. |
$nearSphere | ꡬ체μμ μ κ³Ό κ°κΉμ΄ μμμ geospatial objects λ₯Ό λ°νν©λλ€. geospatial index κ° νμνλ©° 2dsphere index μ 2d index λͺ¨λ $nearSphere λ₯Ό μ§μν©λλ€. |
λ λ§μ λ΄μ©κ³Ό μμλ€μ κ°λ³ μ°Έμ‘° νμ΄μ§μμ λ³Ό μ μμ΅λλ€. ($geoIntersects / $geoWithin / $near / $nearSphere)
3.2 Geospatial Aggregation Stage
MongoDB λ μλμ κ°μ geospatial aggregation pipeline stage λ₯Ό μ§μν©λλ€ :
Stage | Description |
$geoNear | geospatial point μμ κ°κΉμ μ λμ μν΄ μ λ ¬λ documents stream μ λ°νν©λλ€. geospatial data μ λν $match / $sort / $limit κΈ°λ₯μ ν΅ν©ν©λλ€. λ°νλ documents λ μΆκ°λ distance νλκ° ν¬ν¨λμ΄μμΌλ©° μμΉ μλ³μ νλλ₯Ό ν¬ν¨ν μλ μμ΅λλ€. $geoNear μ geospatial index κ° νμν©λλ€. |
λ λ§μ λ΄μ©κ³Ό μμλ€μ $geoNear μ°Έμ‘° νμ΄μ§μμ λ³Ό μ μμ΅λλ€.
3.3 Geospatial Models
MongoDB μ geospatial query λ ꡬ체 νΉμ ννν νλ©΄μμμ geometry λ₯Ό ν΄μν μ μμ΅λλ€.
- 2dsphere index: ꡬ체μ λν 쿼리 (ꡬ체 νλ©΄μ geometry λ₯Ό ν΄μνλ 쿼리) λ§ μ§μν©λλ€.
- 2d index: flat 쿼리 (ννν νλ©΄μμμ geometry λ₯Ό ν΄μνλ 쿼리) μ λͺλͺ ꡬ체μ λν 쿼리λ₯Ό μ§μν©λλ€.
- μ¬κΈ°μ 2d index κ° λͺλͺ ꡬ체μ λν 쿼리λ₯Ό μ§μνκΈ΄ νμ§λ§, κ·Έλ κ² μ¬μ©ν κ²°κ³Όκ°μλ μλ¬κ° μμμ μμ΅λλ€. κ°λ₯νλ©΄ ꡬ체μ λν 쿼리μλ 2dsphere index λ₯Ό μ¬μ©νμΈμ.
μλ νλ κ° geospatial μ°μ°μμ μ¬μ©λλ geospatial query μ°μ°μλ€ (μ§μλλ 쿼리) μ λμ΄ν©λλ€ :
Operation | Spherical/Flat Query | Notes |
$near (GeoJSON point, 2dsphere index) | Spherical | GeoJSON κ³Ό 2dsphere index λ₯Ό ν¨κ» μ¬μ©ν λ λμΌν κΈ°λ₯μ μ 곡νλ $nearSphere μ°μ°μλ 보μμμ€ |
$near (legacy coordinates, 2d index) | Flat | |
$nearSphere (GeoJSON point, 2dsphere index) | Spherical | GeoJSON point μ 2dsphere index λ₯Ό μ¬μ©νλ $near μ°μ°μμ λμΌν κΈ°λ₯μ μ 곡ν©λλ€ |
$nearSphere (legacy coordinates, 2d index) | Spherical | λμ GeoJSON point λ₯Ό μ¬μ©νμΈμ |
$geoWithin: {$geometry: ...} | Spherical | |
$geoWithin: {$box: ...} | Flat | |
$geoWithin: {$polygon: ...} | Flat | |
$geoWithin: {$center: ...} | Flat | |
$geoWithin: {$centerSphere: ...} | Spherical |
Operation | Spherical/Flat Query | Notes |
$geoIntersects | Spherical | |
$geoNear aggregation stage (2dsphere index) | Spherical | |
$geoNear aggregation stage (2d index) | Flat |
3.4 Example
λ€μμ documents λ₯Ό μ¬μ©νμ¬ places λΌλ μ΄λ¦μ collection μ μμ±ν©λλ€ :
db.places.insert( {
name: "Central Park",
location: { type: "Point", coordinates: [ -73.97, 40.77 ] },
category: "Parks"
} );
db.places.insert( {
name: "Sara D. Roosevelt Park",
location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },
category: "Parks"
} );
db.places.insert( {
name: "Polo Grounds",
location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },
category: "Stadiums"
} );
λ€μ μ°μ°μ location νλμ 2dsphere index λ₯Ό μμ±ν©λλ€ :
db.places.createIndex( { location: "2dsphere" } )
$near μ°μ°μλ₯Ό μ¬μ©ν λ€μμ 쿼리λ λͺ μλ GeoJSON point λ‘λΆν° 1000 λ―Έν° μ΄μ 5000 λ―Έν° μ΄νμ documents λ₯Ό κ°μ₯ κ°κΉμ΄ κ²λΆν° κ°μ₯ λ¨Ό μμλ‘ μ λ ¬ν΄ λ°νν©λλ€ :
db.places.find(
{
location:
{ $near:
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
$minDistance: 1000,
$maxDistance: 5000
}
}
}
)
λ€μμ geoNear aggregation operation μ { category: "Parks" } 쑰건μ λ§λ documents λ₯Ό λͺ μλ GeoJSON point λ‘λΆν° κ°μ₯ κ°κΉμ΄ κ²λΆν° κ°μ₯ λ¨Ό μμλ‘ μ λ ¬ν΄ λ°νν©λλ€ :
db.places.aggregate( [
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
spherical: true,
query: { category: "Parks" },
distanceField: "calcDistance"
}
}
] )
μ°Έκ³
- [mongoDB] geospatial queries: https://docs.mongodb.com/manual/geospatial-queries/
'Study: DeveloperTools(DevTool) > DevTool: NoSQL(Elastic, Mongo)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[NoSQL] MongoDB C++ νκ²½ μ€μ νκΈ°(feat. linux mongocxx driver) (0) | 2023.01.12 |
---|---|
[NoSQL] Dockerλ₯Ό μ΄μ©νμ¬ MongoDB μλ² λμ°κΈ° (feat. mongo-express) (0) | 2023.01.10 |
[NoSQL] Apache Cassandra μ 리: NoSQL Column-Family DB (0) | 2022.11.17 |
[NoSQL] Redis(vs Memcached) μ 리: NoSQL Key-value DB (0) | 2022.11.16 |
[NoSQL] mongoDB(vs Elasticsearch) μ 리: NoSQL Document DB (0) | 2022.11.15 |