将 mongodb 集合中的文档副本存储在字典列表中,并使用此数据而不是查询数据库是个好主意吗?

Is it a good idea to store copies of documents from a mongodb collection in a dictionary list, and use this data instead of querying the database?

我目前正在开发 Python Discord 机器人,它使用 Mongo 数据库来存储用户数据。

由于此数据不断变化,数据库将受到大量查询以提取和更新数据;所以我正在尝试寻找方法来最大程度地减少客户端-服务器通信并减少机器人响应时间。

从这个意义上说,一旦脚本 运行 就创建一个 Mongo 集合的副本作为字典列表,并离线而不是连续地操作数据是不是一个好主意查询数据库?

特别是,每次使用 collection.find() 方法搜索数据时,都会从列表中提取数据。另一方面,每次需要使用 collection.update() 更新数据时,列表和数据库都会更新。

我将举一个例子来更好地解释我正在尝试做的事情。假设我的集合包含具有以下结构的文档:

{"user_id": id_of_the_user, "experience": current_amount_of_experience}

而且经验值要不断增加

以下是我目前的实施方式:

online_collection = db["collection_name"] # mongodb cursor
offline_collection = list(online_collection.find()) # a copy of the collection

def updateExperience(user_id):

    online_collection.update_one({"user_id":user_id}, {"$inc":{"experience":1}})
    
    mydocument = next((document for document in offline_documents if document["user_id"] == user_id))
    mydocument["experience"] += 1

def findExperience(user_id):

    mydocument = next((document for document in offline_documents if document["user_id"] == user_id))
    return mydocument["experience"]

如您所见,数据库只涉及更新功能。

这是一种有效的方法吗? 对于非常大的集合(数百万个文档),下一个 () 函数是否具有相同的执行时间,或者仍然会有一些减速?

此外,虽然问题中没有明确询问,但我非常乐意就如何提高 Discord 机器人的性能提出任何建议,只要它不包括使用 VPS 或分片,因为我已经在使用这些选项了。

我真的不明白为什么不——只要你知道以下几点:

  1. 您需要系统资源才能将整个数据库加载到内存中
  2. 您有责任同步实际数据库和本地存储
  3. 您确实需要成为唯一一个person/system更新数据库
  4. 最终这种模式会失败,即数据库变得太大,或者需要更新多个进程,所以它不是面向未来的。

本质上你是在谈论缓存解决方案 - 所以不需要重新发明轮子 - 许多这样的 products/solutions 你可以使用。

这可能不是传统的做事方式,但如果行得通,那为什么不呢