定义
- geoShape
- 如果在索引定义中将 - indexShapes设置为- true,则- geoShape运算符支持查询与给定几何图形相关的形状。- 指定要搜索的坐标时,必须先指定经度,然后指定纬度。 经度值可以介于 - -180和- 180之间,两者均包括在内。 纬度值可以介于- -90和- 90之间,两者均包括在内。 坐标值可以是整数或双精度值。- 注意- MongoDB Search 不支持以下内容: - 非默认坐标参考系 (CRS) 
- 平面 XY 坐标系(二维) 
- 坐标对 点表示法(即 - pointFieldName: [12, 34])
 
语法
1 { 2     "$search": { 3        "index": <index name>, // optional, defaults to "default" 4        "geoShape": { 5           "path": "<field-to-search>", 6           "relation": "contains | disjoint | intersects | within", 7           "geometry": <GeoJSON-object>, 8           "score": <score-options> 9        } 10     } 11 } 
选项
geoShape 使用以下词条来构造查询:
| 字段 | 类型 | 说明 | 必要性 | 
|---|---|---|---|
| 
 | GeoJSON 对象 | GeoJSON对象,用于指定要进行 的 Polygon 、 MultiPolygon 或 LineString Atlas Search形状或点。必须将多边形指定为闭环,其中最后一个位置与第一个位置相同。 计算地理空间结果时, MongoDB Search geoShape 和 geoWithin 操作符以及MongoDB $geoIntersects 操作符使用不同的几何图形。这种差异可以从MongoDB Search 和MongoDB绘制多边形边的方式看出。 MongoDB Search 根据笛卡尔距离绘制多边形,该距离是坐标参考系中两点之间的最短直线。 MongoDB使用基于2dsphere 索引的测地线模式绘制多边形,该索引构建在测地线类型第三方库之上,或者使用来自2d 索引的平面模式绘制多边形。要学习;了解详情,请参阅GeoJSON对象。 对于涉及多边形的地理空间查询, MongoDB Search 和MongoDB可能会返回不同的结果。 | 是 | 
| 
 | 字符串或字符串数组 | 已索引的 geo 类型字段或要搜索的字段。 | 是 | 
| 
 | 枚举 | 查询结构几何图形与索引字段几何图形的关系。值可以是以下之一: 
 | 是 | 
| 
 | 对象 | 分配给匹配搜索结果的分数。 默认情况下,结果中的分数为 
 有关在查询中使用  | no | 
示例
以下示例使用 sample_airbnb数据库中的 listingsAndReviews集合。如果集群上有示例数据集,则可以为地理类型创建自定义MongoDB搜索索引,并在集群上运行示例查询。MongoDB Search 快速入门包含有关加载示例数据集、创建索引定义和运行MongoDB Search 查询的说明。
以下是对listingsAndReviewscollection中的address.location字段进行索引的索引定义示例:
1 { 2   "mappings": { 3     "fields": { 4       "address": { 5         "fields": { 6           "location": { 7             "indexShapes": true, 8             "type": "geo" 9           } 10         }, 11         "type": "document" 12       }, 13       "property_type": { 14         "type": "token" 15       } 16     } 17   } 18 } 
不相交示例
以下示例使用geoShape操作符搜索与指定的夏威夷经度和纬度坐标没有共同之处的属性。
查询包括:
1 db.listingsAndReviews.aggregate([ 2   { 3     "$search": { 4       "geoShape": { 5         "relation": "disjoint", 6         "geometry": { 7           "type": "Polygon", 8           "coordinates": [[[-161.323242,22.512557], 9                           [-152.446289,22.065278], 10                           [-156.09375,17.811456], 11                           [-161.323242,22.512557]]] 12         }, 13         "path": "address.location" 14       } 15     } 16   }, 17   { 18     $limit: 3 19   }, 20   { 21     $project: { 22       "_id": 0, 23       "name": 1, 24       "address": 1, 25       score: { $meta: "searchScore" } 26     } 27   } 28 ]) 
{   "name" : "Ribeira Charming Duplex",   "address" : {     "street" : "Porto, Porto, Portugal",     "suburb" : "",     "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória",     "market" : "Porto",     "country" : "Portugal",     "country_code" : "PT",     "location" : {       "type" : "Point",       "coordinates" : [ -8.61308, 41.1413 ],       "is_location_exact" : false     }   } } {   "name" : "Horto flat with small garden",   "address" : {     "street" : "Rio de Janeiro, Rio de Janeiro, Brazil",     "suburb" : "Jardim Botânico",     "government_area" : "Jardim Botânico",     "market" : "Rio De Janeiro",     "country" : "Brazil",     "country_code" : "BR",     "location" : {       "type" : "Point",       "coordinates" : [ -43.23074991429229, -22.966253551739655 ],       "is_location_exact" : true     }   } } {   "name" : "Private Room in Bushwick",   "address" : {     "street" : "Brooklyn, NY, United States",     "suburb" : "Brooklyn",     "government_area" : "Bushwick",     "market" : "New York",     "country" : "United States",     "country_code" : "US",     "location" : {       "type" : "Point",       "coordinates" : [ -73.93615, 40.69791 ],       "is_location_exact" : true     }   } } 
相交示例
以下示例使用geoShape操作符搜索与西班牙的指定经度和纬度坐标相交的属性。
查询包括:
1 db.listingsAndReviews.aggregate([ 2   { 3     "$search": { 4       "geoShape": { 5         "relation": "intersects", 6         "geometry": { 7           "type": "MultiPolygon", 8           "coordinates": [ 9                         [[[2.16942,41.40082], 10                         [2.17963,41.40087], 11                         [2.18146,41.39716], 12                         [2.15533,41.40686], 13                         [2.14596,41.38475], 14                         [2.17519,41.41035], 15                         [2.16942,41.40082]]], 16                         [[[2.16365,41.39416], 17                         [2.16963,41.39726], 18                         [2.15395,41.38005], 19                         [2.17935,41.43038], 20                         [2.16365,41.39416]]] 21           ] 22         }, 23         "path": "address.location" 24       } 25     } 26   }, 27   { 28     $limit: 3 29   }, 30   { 31     $project: { 32       "_id": 0, 33       "name": 1, 34       "address": 1, 35       score: { $meta: "searchScore" } 36     } 37   } 38 ]) 
{   "name" : "Cozy bedroom Sagrada Familia",   "address" : {     "street" : "Barcelona, Catalunya, Spain",     "suburb" : "Eixample",     "government_area" : "el Fort Pienc",     "market" : "Barcelona",     "country" : "Spain",     "country_code" : "ES",     "location" : {       "type" : "Point",       "coordinates" : [ 2.17963, 41.40087 ],       "is_location_exact" : true     }   } } {   "name" : "",   "address" : {     "street" : "Barcelona, Catalunya, Spain",     "suburb" : "Vila de Gràcia",     "government_area" : "la Vila de Gràcia",     "market" : "Barcelona",     "country" : "Spain",     "country_code" : "ES",     "location" : {       "type" : "Point",       "coordinates" : [ 2.15759, 41.40349 ],       "is_location_exact" : true     }   } } {   "name" : "SPACIOUS RAMBLA CATALUÑA",   "address" : {     "street" : "Barcelona, Catalunya, Spain",     "suburb" : "L'Antiga Esquerra de l'Eixample",     "government_area" : "l'Antiga Esquerra de l'Eixample",     "market" : "Barcelona",     "country" : "Spain",     "country_code" : "ES",     "location" : {       "type" : "Point",       "coordinates" : [ 2.15255, 41.39193 ],       "is_location_exact" : true     }   } } 
示例内
以下示例使用geoShape操作符搜索纽约州位于指定经度和纬度坐标内的房产。 这些查询搜索sample_airbnb数据库的listingsAndReviews集合中的address.location字段。
查询包括:
基本搜索
以下查询返回与指定搜索条件匹配的文档。
1 db.listingsAndReviews.aggregate([ 2   { 3     "$search": { 4       "geoShape": { 5         "relation": "within", 6         "geometry": { 7           "type": "Polygon", 8           "coordinates": [[[-74.3994140625,40.5305017757], 9                           [-74.7290039063,40.5805846641], 10                           [-74.7729492188,40.9467136651], 11                           [-74.0698242188,41.1290213475], 12                           [-73.65234375,40.9964840144], 13                           [-72.6416015625,40.9467136651], 14                           [-72.3559570313,40.7971774152], 15                           [-74.3994140625,40.5305017757]]] 16         }, 17         "path": "address.location" 18       } 19     } 20   }, 21   { 22     $limit: 3 23   }, 24   { 25     $project: { 26       "_id": 0, 27       "name": 1, 28       "address": 1, 29       score: { $meta: "searchScore" } 30     } 31   } 32 ]) 
{   "name" : "Private Room in Bushwick",   "address" : {     "street" : "Brooklyn, NY, United States",     "suburb" : "Brooklyn",     "government_area" : "Bushwick",     "market" : "New York",     "country" : "United States",     "country_code" : "US",     "location" : {       "type" : "Point",       "coordinates" : [ -73.93615, 40.69791 ],       "is_location_exact" : true     }   },   {     "name" : "New York City - Upper West Side Apt",     "address" : {       "street" : "New York, NY, United States",       "suburb" : "Manhattan",       "government_area" : "Upper West Side",       "market" : "New York",       "country" : "United States",       "country_code" : "US",       "location" : {         "type" : "Point",         "coordinates" : [ -73.96523, 40.79962 ],         "is_location_exact" : false       }     },     "score" : 1   }   {     "name" : "Deluxe Loft Suite",     "address" : {       "street" : "Brooklyn, NY, United States",       "suburb" : "Greenpoint",       "government_area" : "Greenpoint",       "market" : "New York",       "country" : "United States",       "country_code" : "US",       "location" : {         "type" : "Point",         "coordinates" : [ -73.94472, 40.72778 ],         "is_location_exact" : true       }     },     "score" : 1   } 
元数据搜索
以下查询返回符合指定搜索条件的属性类型数量(例如公寓、房屋等)。
1 db.listingsAndReviews.aggregate([ 2   { 3     "$searchMeta": { 4       "facet": { 5         "operator": { 6           "geoShape": { 7           "relation": "within", 8           "geometry": { 9             "type": "Polygon", 10             "coordinates": [[[-74.3994140625,40.5305017757], 11                             [-74.7290039063,40.5805846641], 12                             [-74.7729492188,40.9467136651], 13                             [-74.0698242188,41.1290213475], 14                             [-73.65234375,40.9964840144], 15                             [-72.6416015625,40.9467136651], 16                             [-72.3559570313,40.7971774152], 17                             [-74.3994140625,40.5305017757]]] 18           }, 19           "path": "address.location" 20         } 21         }, 22         "facets": { 23           "propertyTypeFacet": { 24             "type": "string", 25             "path": "property_type" 26           } 27         } 28       } 29     } 30   } 31 ]) 
[   {     count: { lowerBound: Long('599') },     facet: {       propertyTypeFacet: {         buckets: [           { _id: 'Apartment', count: Long('486') },           { _id: 'House', count: Long('43') },           { _id: 'Townhouse', count: Long('24') },           { _id: 'Condominium', count: Long('19') },           { _id: 'Loft', count: Long('19') },           { _id: 'Guest suite', count: Long('2') },           { _id: 'Guesthouse', count: Long('2') },           { _id: 'Aparthotel', count: Long('1') },           { _id: 'Hostel', count: Long('1') },           { _id: 'Serviced apartment', count: Long('1') }         ]       }     }   } ] 
查询结果显示指定坐标内的不同类型的属性。