将 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 集合中的文档副本存储在字典列表中,并使用此数据而不是查询数据库是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb怎么插入多个文档

需要 mongodb 查询来检查日期是不是在存储在集合文档中的两个日期之间[重复]

将嵌套的 MongoDB 导入到 Pandas

MongoDB 插入文档

搭建MongoDB副本集&分片

MongoDB副本集部署