我可以在 MongoDB 中使用同一文档中的位置和区域数据进行地理空间查询吗?

Can I do a geospatial query in MongoDB that uses location and region data from the same document?

我想使用 MongoDB 进行地理空间查询,但我想使用来自同一记录的值来检查位置和区域。例如,假定以下记录:

{ 
    "username" : "someUser", 
    "location" : {
        "geometry" : {
            "type" : "Point", 
            "coordinates" : [ 80.0, 8.0 ]
        }
    }, 
    "region" : {
        "_id" : "regionId", 
        "location" : {
            "type" : "Feature", 
            "geometry" : {
                "type" : "Polygon", 
                "coordinates" : [ 
                    [ 40.0, 5.0 ], 
                    [ 100.0, 0.0 ], 
                    [ 100.0, 10.0 ], 
                    [ 40.0, 10.0 ], 
                    [ 40.0, 5.0 ]
                ]
            }
        }
    }
}

我想做的是找到用户位置在区域多边形内的所有文档,这两个文档都在同一个文档中描述。我以为它会是这样的:

db.myCollection.find({
    "location.geometry": { 
        $geoWithin: {
            $geometry: "$regions.location.geometry"
        }
    }
});

但是,这会导致错误:

    "errmsg" : "unknown geo specifier: $geometry: \"$regions.location.geometry\"",

所以问题似乎是不允许您提供指向 $geometry 值的字段路径。不确定我是否有一些语法错误(我尝试了很多东西),或者如果只是 forbidden/not 是否支持这种类型的搜索。或者这可能只是地理空间操作的限制。

不幸的是,mongodb 不允许执行与同一文档中的其他属性进行比较的查询,除非您使用 JS 函数。

这是您正在开发还是正在使用的数据库? 用户的位置或区域是否经常更改? 我问是因为您应该考虑到这种查询将执行完整的集合扫描,因为它需要评估每个文档的 $geoWithin 函数。而且效率不会很高。

我建议在任何 Upsert 操作期间确定该位置是否在多边形内(或不在多边形内),然后将该布尔结果存储在同一文档中的单独属性(我们称之为 'is_within')中,然后在该新属性上添加索引。这样,无论集合大小如何,查询都会非常高效。