【发布时间】:2020-07-27 09:52:45
【问题描述】:
我想为用户附近的区域实施自动完成建议。因此,对于位于旧金山的用户输入“Union Sq”,它可能会建议“Union Square, SF”然后是 Union Square, NY”。这是由一个区域表支持的,其中包括名称、质心和几何。表的大小将是大约 500k 条目,名称上有一个标准(词法)索引,质心上有一个 2dsphere 索引。如何以高效的方式实现这一点?
使用下面的查询,MongoDB 似乎总是使用地理空间索引,这导致运行时间 > 1s。
{
"name": {
"$regex": "^Union Sq"
},
"centroid": {
"$near": {
"$geometry": { "type": "Point", "coordinates": [-122.39986, 37.75716] }
}
}
}
如果我使用 $maxDistance 将结果限制在 100 英里半径范围内,性能会显着提高,但是如果用户的目标是更远的区域,我将需要一个使用 $minDistance 进行二次非性能查询的系统。我想我可以实现 UI,使二级查询纯粹是词法的,这将允许用户在输入足够多的区域名称后最终找到遥远的区域,但对这些名称进行近似排序将是理想的。
使用下面的查询,如果建议接近,MongoDB 似乎表现得相当不错,但是当它需要从更多区域拉取以满足限制时,性能会有所下降。
regions = await Region.aggregate([
{
$geoNear: {
near: {
type: "Point", coordinates: [-122.39986, 37.75716]
},
key: "centroid",
distanceField: "dist.calculated",
query: {
name: { $regex: '^Union Sq' }
}
}
},
{ $limit: 5 }
]);
有没有更好的方法来做到这一点?次要问题包括:
- 是否可以让 MongoDB 先使用词法索引,然后对这些结果进行地理排序?不管上面的第一个查询是什么,MongoDB 似乎总是使用地理索引。
- 这当然不是关键,但理想情况下,我想使用实际几何而不是质心进行排序以获得更准确的结果...这可以以高效的方式完成吗?
【问题讨论】:
标签: mongodb geospatial