我正在使用 mongoDB
来存储多边形集合,并使用 $geoIntersects
查询来查找特定点所在的多边形。
我的 mongoose
Schema
看起来像这样:
var LocationShema = mongoose.Schema({
name: String,
geo: {
type: {
type: String
},
coordinates: []
}
});
LocationShema.index({geo: '2dsphere'});
module.exports = mongoose.model('Location', LocationShema);
因此,每个元素都是一个多边形。我添加了 2dsphere
索引,希望查询速度更快并且整个集合将存储在内存中。不幸的是,大约 600ms
需要大约 20 个查询,这对我的用例来说太多了。
我的查询是这样的:
Location.find({
geo: {
$geoIntersects: {
$geometry: {
type: 'Point',
coordinates: [pos.lng, pos.lat]
}
}
}
},...)
无论如何我可以让这个运行得更快吗?我可以强制 MongoDB 将整个集合缓存在数据库中吗(因为集合永远不会改变)。有什么方法可以检查集合是否实际存储在内存缓存中?
此外,我是否可以使用任何替代方法(例如:库或其他东西)来实现快速地理空间查询?
最佳答案
使用 mongo >3.0,您可以使用内存存储,这意味着当种子集合保留在内存中时,您可以拥有 mongo 实例(所有更改都不会持久化)。
从另一方面来说,如果您的集合是静态的 - 可能有一种方法可以实现像 Redis 这样的缓存存储,甚至可以实现带有存储查询和响应的 TTL 索引集合。
播种过程可以通过当前集合的备份和内存集合中的恢复来完成。
当频繁查询集合时——只要 mongo 需要加载其他集合(在繁忙的系统上),它就会留在内存中。
欢迎任何评论!
关于javascript - 内存中的MongoDB缓存集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37812923/