MongoDB 创建具有用于空间查询的特征数组的 2dsphere 索引

Posted

技术标签:

【中文标题】MongoDB 创建具有用于空间查询的特征数组的 2dsphere 索引【英文标题】:MongoDB create 2dsphere indexes with array of features for spatial query 【发布时间】:2021-03-12 18:14:51 【问题描述】:

我想在 MongoDB 的“功能”字段上创建一个 2dsphere 索引。但它包含一组 GeoJSON LineStrings。如果没有这个数组,我只能为单个 GeoJSON LineString 创建 2dsphere 索引,例如db.collection.createIndex( loc : "2dsphere" )。我想执行像collection.find( $features: $geometry: bounding_box )这样的空间查询

有人知道如何为 GeoJSON 对象数组创建 2dsphere 吗?


    "_id" : ObjectId("..."),
    "name" : "street_segment_names",
    "features" : [ 
        
            "type" : "Feature",
            "geometry" : 
                "type" : "LineString",
                "coordinates" : [ 
                    [.,.],[.,.],[.,.]
                ]
            ,
            "properties" : 
                "speed_limit" : 20
            
        , 
        
            "type" : "Feature",
            "geometry" : 
                "type" : "LineString",
                "coordinates" : [ 
                    [.,.],[.,.],[.,.]
                ]
            ,
            "properties" : 
                "speed_limit" : 30
            
        
    ]

【问题讨论】:

【参考方案1】:

MongoDB 不支持将“Feature”作为 GeoJSON 对象类型。见https://docs.mongodb.com/manual/reference/geojson/#geojson-objects

问题中显示的结构在特征对象中包含一个“几何”字段,该字段似乎是受支持的对象类型。

您可以使用以下方法在该字段上创建索引:

db.collection.createIndex("features.geometry":"2dsphere")

根据您使用“边界框”查询的目标,您可以使用$geoWithin 或$geoIntersects,例如

db.collection.find(
  "features.geometry":
     $geoWithin: 
        $geometry: 
           type: <"Polygon" or "MultiPolygon"> ,
           coordinates: [ <coordinates> ]
        
     
  
)

【讨论】:

这有帮助。谢谢!

以上是关于MongoDB 创建具有用于空间查询的特征数组的 2dsphere 索引的主要内容,如果未能解决你的问题,请参考以下文章

具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311

Mongodb数组查询:查找数组中包含局外人的记录[重复]

MongoDB:具有数组输入的复杂查询

MongoDB索引

为啥 mongodb 查询在数组中查找具有两个值的文档不起作用?

MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档