Mongodb数据库转换为表格文件的库

前言

大家好,我是吴老板。今天给大家分享一个可将Mongodb数据库里边的文件转换为表格文件的库,这个库是我自己开发的。

Mongo2file库是一个 Mongodb 数据库转换为表格文件的库。

在我的日常工作中经常和 mongodb 打交道,而从 mongodb 数据库中批量导出数据为其他格式则成为了刚需。

如果您跟我一样每次导出数据时都需要重新编写或到处寻找 脚本代码 的话,这个库可能会对您产生帮助。

依赖于快速 PyArrow

mongo2file 依赖于 PyArrow 库。它是 C++ Arrow 的 Python 版本实现。

PyArrow 目前与 Python 3.7、3.8、3.9 和 3.10 兼容。

仓库地址: https://github.com/apache/arrow。

如果您在 Windows 上遇到任何的导入问题或错误,您可能需要安装 Visual Studio 2015。

警告: PyArrow 目前只支持到 win64 位 ( Python 64bit ) 操作系统。

其次,除了常见的 csv、excel、以及 json 文件格式之外, mongo2file 还支持导出 pickle、feather、parquet 的二进制压缩文件。

pickle、feather、parquet 是 Python 序列化数据的一种文件格式, 它把数据转成二进制进行存储。从而大大减少读取的时间。

安装

pipinstallmongo2file

基本用法

快速开始

当 MongoEngine 控制类指定了 mongodb 表名称时、将对数据表 (mongodb集合) 进行导出操作。

其类方法参数包括:

  • query: 指定对数据表的查询参数、只对指定表名时有效。
  • folder_path: 指定导出目录路径。
  • filename: 指定导出文件名、默认为 表名称 + 当前时间。
  • _id: 指定是否导出 _id、布尔型、默认为 False。
  • limit: 指定导出表的限制数据、int类型、默认为 -1、即不限制。
importos
frommongo2fileimportMongoEngine
"""
作用于 MongoEngine 类未指定表名称时
"""
M=MongoEngine(
host=os.getenv('MONGO_HOST', '127.0.0.1'),
port=int(os.getenv('MONGO_PORT', 27017)),
username=os.getenv('MONGO_USERNAME', None),
password=os.getenv('MONGO_PASSWORD', None),
database=os.getenv('MONGO_DATABASE', 'test_')
)
defto_csv():
result_=M.to_csv()
assert"successfully"inresult_
defto_excel():
result_=M.to_excel()
assert"successfully"inresult_
defto_json():
result_=M.to_json()
assert"successfully"inresult_
to_csv()

当 MongoEngine 控制类只指定了 mongodb 库名称时、将对数据库下所有集合进行导出操作。

面对 mongo2file 的瓶颈和改进

对于 mongodb 的全表查询、条件查询、聚合操作、以及索引操作(当数据达到一定量级时建议) 并不是直接影响 数据导出的最大因素。

因为 mongodb 的查询一般而言都非常快速,主要的瓶颈在于读取 数据库 之后将数据转换为大列表存入 表格文件时所耗费的时间。

这是一件非常可怕的事情。

当没有多线程(当然这里的多线程并不是对同一文件进行并行操作,文件写入往往是线程不安全的)、 数据表查询语句无优化时,并且当数据达到一定量级时(比如 100w 行),单表单线程表现出来的效果真是让人窒息。

在 mongo2file 在进行大数据量导出时表现的并没有多么优秀。导致的主要原因可能是:

  • 采用的 xlsxwriter 库写入 excel 时是积极加载(非惰性)的,数据全部加载至内存后插入表格。
  • 大数据量插入表格时、跟宿主机器的性能有关。
  • mongo2file 表现的不如人意时,我做出了一下改进。
  • 当数据量过大时,数据表分块读取,导出多表格。
  • 增加线程池的最大并发数、当选取的 block_size 值合适时,将发挥最大性能。

对于数据转换一些建议

  • 对于 xlsxwriter、openpyxl、xlwings 以及 pandas 引用的任何引擎进行写入操作时、都会对写入数据进行非法字符的过滤。这一点从部分源码中可以看得出来。
  • 由于行数据表中可能存在 excel 无法识别的非法字符 (比如空列表 []) , 当写至此行时将抛出 非法类型 的错误。
  • 而比较恰当合理的做法就是在存储 mongodb 文档时不要存入类似于 []、{} 的这种对原始数据无意义的空对象。

Reference API

MongoEngine

MongoEngine(
host='localhost',
port=27017,
username=None,
password=None,
database='测试库',
collection='测试表_200000'
)

to_csv(query, folder_path, filename, …)

:paramquery: 数据库查询条件、字典类型、只作用于单表导出
:paramfolder_path: 指定导出的目录
:paramfilename: 指定导出的文件名
:param_id: 是否导出_id默认否
:paramlimit: 限制数据表查询的条数
:paramis_block: 是否分块导出
:paramblock_size: 块大小、is_blockTrue时生效

to_excel(query, folder_path, filename, …)

:paramquery: 数据库查询条件、字典类型、只作用于单表导出
:paramfolder_path: 指定导出的目录
:paramfilename: 指定导出的文件名
:param_id: 是否导出_id默认否
:paramlimit: 限制数据表查询的条数
:paramis_block: 是否分块导出
:paramblock_size: 块大小、is_blockTrue时生效
:parammode: 导出模式, 枚举类型、sheetxlsx, is_blockTrue时生效
:paramignore_error: 是否忽略错误、数据表中存在非序列化类型时使用、这将一定程度上影响程序的性能

to_json(query, folder_path, filename, …)

:paramquery: 数据库查询条件、字典类型、只作用于单表导出
:paramfolder_path: 指定导出的目录
:paramfilename: 指定导出的文件名
:param_id: 是否导出_id默认否
:paramlimit: 限制数据表查询的条数
:paramis_block: 是否分块导出
:paramblock_size: 块大小、is_blockTrue时生效

to_pickle(query, folder_path, filename, …)

:paramquery: 数据库查询条件、字典类型、只作用于单表导出
:paramfolder_path: 指定导出的目录
:paramfilename: 指定导出的文件名
:param_id: 是否导出_id默认否
:paramlimit: 限制数据表查询的条数

to_feather(query, folder_path, filename, …)

:paramquery: 数据库查询条件、字典类型、只作用于单表导出
:paramfolder_path: 指定导出的目录
:paramfilename: 指定导出的文件名
:param_id: 是否导出_id默认否
:paramlimit: 限制数据表查询的条数

to_parquet(query, folder_path, filename, …)

:paramquery: 数据库查询条件、字典类型、只作用于单表导出
:paramfolder_path: 指定导出的目录
:paramfilename: 指定导出的文件名
:param_id: 是否导出_id默认否
:paramlimit: 限制数据表查询的条数

总结

以上就是今天要分享的全部内容了,总的来说,Mongo2file库是一个可以将 Mongodb 数据库转换为表格文件的库,不仅支持导出csv、excel、以及 json 文件格式, 还支持导出 pickle、feather、parquet 的二进制压缩文件。欢迎大家积极尝试。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/234905.html<

(0)
管理的头像管理
上一篇2025-04-21 07:34
下一篇 2025-04-21 07:36

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注