我可以在 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')中,然后在该新属性上添加索引。这样,无论集合大小如何,查询都会非常高效。
我想使用 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')中,然后在该新属性上添加索引。这样,无论集合大小如何,查询都会非常高效。