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

时间:2016-01-22 22:11:18

标签: mongodb geospatial

我想用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值的字段路径。不确定我是否有一些语法错误(我尝试了很多事情),或者这种类型的搜索是否只是被禁止/不支持。或者它可能仅仅是对地理空间操作的限制。

1 个答案:

答案 0 :(得分:0)

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

这是您正在开发或只是消费的数据库吗? 对于用户来说,位置或区域是否经常变化? 我问,因为你应该考虑这种查询将执行完整的集合扫描,因为它需要在每个文档上评估$ geoWithin函数。这不会非常有效。

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