我使用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将整个集合缓存在数据库中(因为集合永远不会更改)。有什么方法可以检查集合是否实际存储在内存缓存中?
此外,我可以使用任何替代方案(例如:图书馆或其他东西)来进行快速的地理空间查询吗?
答案 0 :(得分:2)
使用mongo> 3.0,您可以使用inMemory存储,这意味着当种子集合保留在内存中时您可以拥有mongo实例(所有更改都不会保留)。
如果你的收藏是静态的,那么从另一方面来看,可能有办法实现像Redis这样的缓存存储,甚至是带有存储查询和响应的TTL索引收集。
播种过程可以通过备份当前集合并在内存集合中恢复来完成。
当经常查询集合时 - 只要mongo需要加载其他集合(在繁忙的系统上),它就会残留在内存中。
欢迎任何评论!
答案 1 :(得分:0)
您不能将特定集合保存在内存中,而将其他集合保存在磁盘中,但请记住,当您一次又一次执行相同查询时,mongodb 在内部会进行一些缓存。
您可以执行以下操作:
$merge
或 $out
创建“视图”并使用 find (all) 查询此集合。顺便说一句,有时最好进行完整扫描而不是通过索引(以防您有很多结果,尤其是每个文档都很大时)。因此,使用“视图”,您可以不使用任何索引 - 因为您进行了查找 - 并且您可以更好地更改要缓存的结果。这也与您的 RAM 有多大有关,因为 mongodb 可能需要在 RAM 中交换数据