Node.js&;MongoDB |通过存储本地JSON文件减少对DB的调用

Node.js&;MongoDB |通过存储本地JSON文件减少对DB的调用,node.js,mongodb,Node.js,Mongodb,我正在开发一个应用程序,向用户显示其所选位置内的某些可用服务,包括该服务的价格。我将服务存储在一个集合中,并将这些服务的价格存储在各自的另一个集合中(价格)。有些服务具有相同的定价,因此通常存在一对多关系 问题是,在我用来确定最佳可用服务的“算法”中,有很多值是我通过轮询Mongo并获得正确的值(包括服务价格)来确定的 我最初将每个服务的定价结构嵌入到服务模型中,但这是一个问题,因为我必须定期扫描服务集合,以更新此定价的变化/波动性。我最终将一个DB引用从服务嵌入到价格 我的问题 我如何才能在减

我正在开发一个应用程序,向用户显示其所选位置内的某些可用服务,包括该服务的价格。我将
服务
存储在一个集合中,并将这些服务的价格存储在各自的另一个集合中(
价格
)。有些服务具有相同的定价,因此通常存在一对多关系

问题是,在我用来确定最佳可用服务的“算法”中,有很多值是我通过轮询Mongo并获得正确的值(包括服务价格)来确定的

我最初将每个服务的定价结构嵌入到
服务
模型中,但这是一个问题,因为我必须定期扫描
服务
集合,以更新此定价的变化/波动性。我最终将一个DB引用从
服务
嵌入到
价格

我的问题

我如何才能在减少Mongo通话次数的同时,最好地实现我目前正在做的事情

目前,我对Mongo的点击率为每个用户搜索50-400次(特别是定价),这与其他查询相结合时会稍微降低速度,而且效率极低。 我正在考虑一些选择:

  • 创建一个bucket(可能是节点中
    global
    命名空间中的一个对象),通过
    \u id
    缓存所有定价信息。每次我需要查找
    服务的定价
    ,我都会查看该存储桶,如果定价已经缓存在该存储桶中,我会进行计算并返回价格,否则我会从Mongo获取文档并将其添加到该存储桶中以供当前和将来使用
  • 我担心这可能会带来诸如内存泄漏之类的问题。理想情况下,bucket应该对所有用户都可用,而不是像cookie那样只属于一个用户(我对cookie的理解可能是错误的)。我还不知道是否有可能全局公开一个对象,让所有用户都能访问它

  • 我见过许多Mongo的“内存内实现”(目前找不到),它们模拟MongoDB,但使用LocalStorage作为数据存储。我正在考虑分叉其中一个,并调整它们的服务器端功能 我不知道这是否可行,而且似乎需要一些时间

  • 将数据存储为JSON文件(或多个文件,我可以找到一种拆分文件的方法)。然后,我可以通过
    require()
    ing读取带有节点的JSON文件。这是目前我的首选选项,因为我可以使用
    fs
    API来处理JSON文件的定期更新
  • 我担心JSON文件的大小,主要是如果它们足够大,可能会减慢节点的速度,但我正在考虑这一点,因为我将在数据库上节省50-400次点击。我还假设我不会将一个JSON文件加载
    n
    次(
    n
    是某个时间点服务上的用户数)

    考虑到以上3个选项,哪一个有很好的工作机会?有些选项可能是不可能的,所以我可以把它们从我的列表中划掉,可能还有一些我还没有考虑过

    最后,我的免责声明: 我知道在SQL中使用JOIN语句可以很容易地实现这一点,不,我不是在用锤子做需要螺丝刀的事情。虽然对于我项目的某些部分SQL看起来是一个明显的胜利,但对于我存储的大部分数据,Mongo更好。再加上以体验的名义重新发明轮子会有所帮助


    多亏了

    让mongodb将数据存储在内存中而不是硬盘上是一个很好的考虑因素。这是可能的,因为mongodb是IO不可知论者。看看这篇文章:我已经看过这篇文章了,我不想让自己的事情复杂化,至少现在是这样。我已经实施了第三种方案,并将在几周内投入生产。之后我会决定哪一个更好。我会考虑将所有东西都存储在内存中,我认为Mongo已经做到了。一个很好的考虑是使用像redis这样的缓存。“他们都踢得很好。”普拉迪普·马德武肯定会调查此事,但他没有想到这一点。我会在这几周内尝试一下,然后回来用我的结果更新这个问题