内存中的MongoDB缓存集合?

时间:2016-06-14 13:05:15

标签: javascript node.js mongodb caching geospatial

我使用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将整个集合缓存在数据库中(因为集合永远不会更改)。有什么方法可以检查集合是否实际存储在内存缓存中

此外,我可以使用任何替代方案(例如:图书馆或其他东西)来进行快速的地理空间查询吗?

2 个答案:

答案 0 :(得分:2)

使用mongo> 3.0,您可以使用inMemory存储,这意味着当种子集合保留在内存中时您可以拥有mongo实例(所有更改都不会保留)。

如果你的收藏是静态的,那么从另一方面来看,可能有办法实现像Redis这样的缓存存储,甚至是带有存储查询和响应的TTL索引收集。

播种过程可以通过备份当前集合并在内存集合中恢复来完成。

当经常查询集合时 - 只要mongo需要加载其他集合(在繁忙的系统上),它就会残留在内存中。

欢迎任何评论!

答案 1 :(得分:0)

您不能将特定集合保存在内存中,而将其他集合保存在磁盘中,但请记住,当您一次又一次执行相同查询时,mongodb 在内部会进行一些缓存。

您可以执行以下操作:

  • 选项 1:您可以使用 $merge$out 创建“视图”并使用 find (all) 查询此集合。顺便说一句,有时最好进行完整扫描而不是通过索引(以防您有很多结果,尤其是每个文档都很大时)。因此,使用“视图”,您可以不使用任何索引 - 因为您进行了查找 - 并且您可以更好地更改要缓存的结果。这也与您的 RAM 有多大有关,因为 mongodb 可能需要在 RAM 中交换数据
  • 选项 2:如果您的数据是只读的,您可以完全在内存中加载一个 mongodb (https://docs.mongodb.com/manual/core/inmemory/),只有这个集合。但是你必须找到一种方法,当 mongodb 重新启动时,再次创建和填充集合。