我想用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值的字段路径。不确定我是否有一些语法错误(我尝试了很多事情),或者这种类型的搜索是否只是被禁止/不支持。或者它可能仅仅是对地理空间操作的限制。
答案 0 :(得分:0)
不幸的是,mongodb不允许与同一文档中的其他属性进行比较,除非您使用JS函数。
这是您正在开发或只是消费的数据库吗? 对于用户来说,位置或区域是否经常变化? 我问,因为你应该考虑这种查询将执行完整的集合扫描,因为它需要在每个文档上评估$ geoWithin函数。这不会非常有效。
我建议在任何Upsert操作期间确定位置是否在多边形内(或不在多边形内),然后将该布尔结果存储在一个单独的属性中(让我们称之为' is_within')在同一文档中,并在该新属性上添加索引。这样,无论集合的大小如何,查询都将非常高效。