将 mongodb 集合中的文档副本存储在字典列表中,并使用此数据而不是查询数据库是个好主意吗?
Posted
技术标签:
【中文标题】将 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? 【发布时间】:2021-06-04 09:37:40 【问题描述】:我目前正在开发一个 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"]
如您所见,数据库仅用于更新功能。
这是一种有效的方法吗? 对于非常大的集合(数百万个文档),next () 函数是否具有相同的执行时间,还是会有一些减速?
此外,虽然问题中没有明确提出,但我非常乐意获得有关如何提高 Discord 机器人性能的任何建议,只要它不包括使用 VPS 或分片,因为我已经在使用这些选项了。
【问题讨论】:
【参考方案1】:我真的不明白为什么不 - 只要你知道以下几点:
-
您需要系统资源才能将整个数据库加载到内存中
同步实际数据库和本地存储是您的责任
您必须是唯一更新数据库的人/系统
最终这种模式会失败,即 db 变得太大,或者需要更新多个进程,因此它不是面向未来的。
本质上,您是在谈论缓存解决方案 - 因此无需重新发明*** - 您可以使用许多此类产品/解决方案。
这可能不是传统的做事方式,但如果它有效,那为什么不呢
【讨论】:
以上是关于将 mongodb 集合中的文档副本存储在字典列表中,并使用此数据而不是查询数据库是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章