定义
geoShape如果在索引定义中将
indexShapes设置为true,则geoShape操作符支持查询与给定几何图形有关系的形状。指定要搜索的坐标时,必须先指定经度,然后指定纬度。 经度值可以介于
-180和180之间,两者均包括在内。 纬度值可以介于-90和90之间,两者均包括在内。 坐标值可以是整数或双精度值。注意
MongoDB Search 不支持以下内容:
非默认坐标参考系 (CRS)
平面 XY 坐标系(二维)
坐标对 点表示法(即
pointFieldName: [12, 34])
语法
{ "$search": { "index": <index name>, // optional, defaults to "default" "geoShape": { "path": "<field-to-search>", "relation": "contains | disjoint | intersects | within", "geometry": <GeoJSON-object>, "score": <score-options> } }}选项
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 集合。如果集群上有 示例数据集,则可以为 geo 类型创建自定义 MongoDB Search 索引,并在集群上运行示例查询。MongoDB Search 快速入门包含加载 示例数据集、创建 索引定义以及运行 MongoDB Search 查询的说明。
以下是对listingsAndReviewscollection中的address.location字段进行索引的索引定义示例:
{ "mappings": { "fields": { "address": { "fields": { "location": { "indexShapes": true, "type": "geo" } }, "type": "document" }, "property_type": { "type": "token" } } }}不相交示例
以下示例使用geoShape操作符搜索与指定的夏威夷经度和纬度坐标没有共同之处的属性。
查询包括:
db.listingsAndReviews.aggregate([ { "$search": { "geoShape": { "relation": "disjoint", "geometry": { "type": "Polygon", "coordinates": [[[-161.323242,22.512557], [-152.446289,22.065278], [-156.09375,17.811456], [-161.323242,22.512557]]] }, "path": "address.location" } } }, { $limit: 3 }, { $project: { "_id": 0, "name": 1, "address": 1, score: { $meta: "searchScore" } } }])相交示例
以下示例使用geoShape操作符搜索与西班牙的指定经度和纬度坐标相交的属性。
查询包括:
db.listingsAndReviews.aggregate([ { "$search": { "geoShape": { "relation": "intersects", "geometry": { "type": "MultiPolygon", "coordinates": [ [[[2.16942,41.40082], [2.17963,41.40087], [2.18146,41.39716], [2.15533,41.40686], [2.14596,41.38475], [2.17519,41.41035], [2.16942,41.40082]]], [[[2.16365,41.39416], [2.16963,41.39726], [2.15395,41.38005], [2.17935,41.43038], [2.16365,41.39416]]] ] }, "path": "address.location" } } }, { $limit: 3 }, { $project: { "_id": 0, "name": 1, "address": 1, score: { $meta: "searchScore" } } }])示例内
以下示例使用geoShape操作符搜索纽约州位于指定经度和纬度坐标内的房产。 这些查询搜索sample_airbnb数据库的listingsAndReviews集合中的address.location字段。
查询包括:
基本搜索
以下查询返回与指定搜索条件匹配的文档。
db.listingsAndReviews.aggregate([ { "$search": { "geoShape": { "relation": "within", "geometry": { "type": "Polygon", "coordinates": [[[-74.3994140625,40.5305017757], [-74.7290039063,40.5805846641], [-74.7729492188,40.9467136651], [-74.0698242188,41.1290213475], [-73.65234375,40.9964840144], [-72.6416015625,40.9467136651], [-72.3559570313,40.7971774152], [-74.3994140625,40.5305017757]]] }, "path": "address.location" } } }, { $limit: 3 }, { $project: { "_id": 0, "name": 1, "address": 1, score: { $meta: "searchScore" } } }])元数据搜索
以下查询返回符合指定搜索条件的属性类型数量(例如公寓、房屋等)。
db.listingsAndReviews.aggregate([ { "$searchMeta": { "facet": { "operator": { "geoShape": { "relation": "within", "geometry": { "type": "Polygon", "coordinates": [[[-74.3994140625,40.5305017757], [-74.7290039063,40.5805846641], [-74.7729492188,40.9467136651], [-74.0698242188,41.1290213475], [-73.65234375,40.9964840144], [-72.6416015625,40.9467136651], [-72.3559570313,40.7971774152], [-74.3994140625,40.5305017757]]] }, "path": "address.location" } }, "facets": { "propertyTypeFacet": { "type": "string", "path": "property_type" } } } } }])查询结果显示指定坐标内的不同类型的属性。