PostgreSQL 18 JSONB 增加能取代 MongoDB 吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lxue
0D
V2EX    PostgreSQL

PostgreSQL 18 JSONB 增加能取代 MongoDB 吗?

  •  
  •   lxue 275 天前 5343 次点击
    这是一个创建于 275 天前的主题,其中的信息可能已经有所发展或是发生改变。
    31 条回复    2025-02-28 09:49:53 +08:00
    8PCSIZ7tmy4x9xFJ
        1
    8PCSIZ7tmy4x9xFJ  
       275 天前
    PostgreSQL 18 在新版本中加入了许多有趣的新功能,比如对 JSONB 的增强支持、对全文搜索的优化、以及更强大的扩展能力等,的确使得 PostgreSQL 在一些应用场景下更具竞争力。不过,能否完全取代 MongoDB ,还是要看具体的使用场景。

    PostgreSQL 18 的新功能亮点
    JSONB 和文档存储增强:PostgreSQL 18 加强了对 JSONB 数据类型的支持,提供了更强的索引优化和查询性能,对于需要存储非结构化数据或半结构化数据的应用,能够提供类似 MongoDB 的功能。

    全文搜索:PostgreSQL 在全文搜索的表现也有所提升,尤其在复杂查询和多字段匹配方面。虽然 MongoDB 在搜索引擎方面的支持也不错,但 PostgreSQL 通过扩展(如 pg_trgm 和 tsvector )能够实现更强的文本搜索能力。

    聚合与扩展性:PostgreSQL 提供了比 MongoDB 更强大的聚合功能,尤其在数据分析领域,PostgreSQL 可以执行复杂的 SQL 查询,支持事务、外键约束等,适合需要强一致性的场景。

    扩展支持:PostgreSQL 的扩展支持非常强大,可以通过各种插件增强数据库的功能,甚至可以结合 PostGIS 执行空间数据查询等。而 MongoDB 则主要专注于文档存储和灵活的键值数据存储。

    PostgreSQL 与 MongoDB 的对比
    数据模型差异:MongoDB 是一个面向文档的 NoSQL 数据库,天然支持 JSON 格式的数据结构,适合高并发、分布式的应用,且无模式的设计非常灵活。PostgreSQL 在 JSONB 类型上虽然有所增强,但本质上还是关系型数据库,更适合复杂的关系型数据结构和事务。

    水平扩展:MongoDB 在水平扩展( sharding )方面有天然的优势,特别是在处理大规模、分布式数据时,MongoDB 更容易做到自动分片和扩展。虽然 PostgreSQL 在某些扩展方面也支持分布式部署,但在水平扩展的能力上,MongoDB 更加成熟。

    事务支持:PostgreSQL 提供了强一致性的事务支持,适用于需要高数据一致性和复杂查询的场景。MongoDB 在事务支持上有改进,但在一些场景下仍然不如 PostgreSQL 可靠。

    结论
    虽然 PostgreSQL 18 通过增强对 JSONB 和全文搜索的支持,能在一定程度上取代 MongoDB 处理半结构化数据的能力,但如果你需要处理大规模分布式数据、自动扩展、以及更灵活的数据模式,MongoDB 依然在这些方面表现更好。

    因此,是否能完全取代 MongoDB ,取决于你的应用场景。如果是需要强一致性、复杂关系数据和复杂查询的系统,PostgreSQL 可能是更好的选择。如果是需要处理大规模分布式文档数据和灵活存储,MongoDB 可能更合适。
    knightgao2
        2
    knightgao2  
       275 天前   1
    @xiaogu 你号没了
    knightgao2
        3
    knightgao2  
       275 天前   1
    好好说话
    我们希望能够在 V2EX 建立和倡导一种好好说话的氛围。

    请尽量描述事实,而非观点。
    如果你要反驳什么,请反驳那个主要的要点,而不是一些旁枝末节。
    我们建立这里的主要目的是为了讨论技术细节。不要在 V2EX 讨论任何国家的政治。
    如果你要说的话是为了伤害别人,那么请不要说。如果你要说的话,你有预感在将来你会想要删掉它,那你最好现在就不要说。
    在一个公共空间的公共讨论中,我们应该关注的,是自己能够在这些讨论中提供什么样的建设性增益,而不是那些纯粹个人的感受。比如当大家在讨论一件你不了解的东西时,你没有必要去回复一条“不明觉厉”。
    请不要把 AI 生成的回复,当作你自己的回复,发到这里。
    回忆一下你看过的电影里的那些正面角色的说话方式把一件事情好好陈述出来,没有冷笑,没有嘲讽,没有反问,就只是好好说话而已。
    qW7bo2FbzbC0
        4
    qW7bo2FbzbC0  
       275 天前
    我觉得还是专库专用,瑞士军刀虽然比较百搭,但是职业工作的话,一般会选择专业套装
    privil
        5
    privil  
       275 天前
    日常销号系列。话说 FerretDB 也 2.0 了

    MongoDB 的开源替代方案 FerretDB 发布 2.0 版本

    https://mp.weixin.qq.com/s/h-USEDmzAWXh6aZVdXuXpA
    happyxhw101
        6
    happyxhw101  
       275 天前
    主要还是取决于你都场景和规模
    如果是单机的话,我觉得 pg 可以代替 mongodb ,但是如果考虑分布式,那么就不一定了
    laikicka
        7
    laikicka  
       275 天前   2
    @Livid #2 ai 回复
    codingmiao
        8
    codingmiao  
       275 天前
    MongoDB 早就名誉扫地了吧,牛逼吹上天,坑一大堆。话说有哪些场景是必须要 JSON 格式才能去支撑的呀,业务成熟起来后,都会变成明确的字段结构,又回到传统关系型库。
    lxue
        9
    lxue  
    OP
       275 天前
    @qW7bo2FbzbC0 维护太多种数据库比较麻烦,如果 pg json 速度可以,我个人倾向直接用 pg
    dayeye2006199
        10
    dayeye2006199  
       275 天前
    没啥太复杂的需求,只是希望用 json 的结构体+部分简单基于 json 的查询,PG 是完全可以的。
    PG 功能很多,全文搜索,向量查询,如果需求不太复杂,一个数据库可以胜任好多不同的任务
    roundgis
        11
    roundgis  
       275 天前 via Android   1
    微软贡献了一个 documentdb 的插件 ferretdb2.0 就是基于这个插件的 据说大幅度提升兼容性和性能

    Ferretdb 之前的版本我试用过 修改奇慢无比 查询勉强可用。

    Pg jsondb 和 mongodb 不是一回事 只是看起来像而已。如果真的是差不多那 ferretdb 还至于花这么多功夫么

    微软更没有必要搞插件了
    roundgis
        12
    roundgis  
       275 天前 via Android
    @codingmiao 用的人还是不少的 django 最近都开始支持 mongodb 了
    viking602
        13
    viking602  
       275 天前
    @xiaogu 请不要把 AI 生成的回复,当作你自己的回复,发到这里
    viking602
        14
    viking602  
       275 天前   1
    @livid 一楼 AI
    sockpuppet9527
        15
    sockpuppet9527  
       275 天前   1
    不太清楚 MongoDB , 但对于 PG 的 JSONB 来说的话,取部分 JSON 数据是不下推的。意味着如果你本身单条 JSON 数据很大,又存在取部分 JSON Key 的场景的话,做 seq scan 依然会把完整 JSON 读出来。当然你可以建对应的 GIN Index 来改善这一点。

    还有另外一点 PG 取 JSONB 的话,可能需要将你的 sql 改为 [jsonpath Accessors]( https://www.postgresql.org/docs/current/datatype-json.html#DATATYPE-JSONPATH) 来取部分数据
    qW7bo2FbzbC0
        16
    qW7bo2FbzbC0  
       275 天前
    @lxue 很简单的,我直接用 MySQL JSON 列。复杂的放 MongoDB
    C02TobNClov1Dz56
        17
    C02TobNClov1Dz56  
       275 天前
    我更倾向于专门的工具做专门的事, 如果你的系统没有特别复杂, 倒是可以用 pg 自带的 jsonb, 但是如果需要做 json相关的操作很多, 还是建议用 MongoDB
    Livid
        18
    Livid  
    MOD
    PRO
       275 天前   1
    @laikick
    @viking602

    谢谢,那个用 AI 回复的账号已经被彻底 ban 。
    musi
        19
    musi  
       275 天前
    mysql 不也支持简单的 json 么,这个 JSONB 和 mysql 的比有什么优势?
    niubiman
        20
    niubiman  
       275 天前
    @musi pgsql 钟的 jsonb 和 json 是存储方式不同, jsonb 是采用二进制存储,json 是文本存储, jsonb 写入性能差一些, 读取性能高一些, jsonb 反之, 我没怎么用过 mysql 的 json, 我才差异可能类似吧
    niubiman
        21
    niubiman  
       275 天前
    @niubiman 是" json 反之"
    zhengfan2016
        22
    zhengfan2016  
       275 天前
    实话说,我很讨厌 mongodb ,有些公司很喜欢用 mongodb 存数据,经常做一些需要关系查询的活,放着 mysql 和 pgsql 不用,mongodb 又没什么比较好的 orm 库(nodejs 除外)。开发体验相比 sql 就是一坨
    yh7gdiaYW
        23
    yh7gdiaYW  
       275 天前
    @zhengfan2016 MongoDB 本来就不应该使用 ORM 库,等于主动放弃了灵活性上的优势
    skallz
        24
    skallz  
       275 天前
    @zhengfan2016 mongodb 主要是应付多变的业务场景,很多人就喜欢用,比如初期的 saas 项目,游戏项目等等,这类场景迭代速度远远超过你的设计速度,哈哈,当然代价就是维护火葬场,不过这类项目开始目标都是活下来,后续维护都不一定会有了
    QlanQ
        25
    QlanQ  
       275 天前
    @zhengfan2016 mongodb 本来就是为了 不做 关系才用的,把关系提前找好,用来做大宽表,可以理解成把 连表查询后的所有字段 放在一行
    yh7gdiaYW
        26
    yh7gdiaYW  
       275 天前   1
    曾经重度使用过 MongoDB ,在我看来 MongoDB 的主要优势是:
    1. JSON 操作语法完爆所有基于 SQL 的语法,配合 Python 、NodeJS 这类语言用的很舒服(反之我感觉喜欢写 JAVA 的人会很讨厌 MongoDB ),SQL 的 JSON 语法在我看来简直是鬼画符。
    2. 灵活性很高,比如连集合(数据表)都不需要事先建好、建索引语句可以重复调用等
    3. 统计查询的性能不错,比 pg 和 mysql 都要强。但有联表查询需求的话就蛋疼了,单表性能也打不过现代的列存数据库。
    缺点就更多了,16MB 的单文档限制非常操蛋,事务必须搭 replica set ,多表联查能力残疾等,我们的新项目慢慢也不再使用 MongoDB
    yh7gdiaYW
        27
    yh7gdiaYW  
       275 天前
    @skallz 说得对,我们前期 python+mongodb 开发效率简直上天了,代价是后期各种重构
    zhang77555
        28
    zhang77555  
       275 天前
    不能, 性能和查询灵活度都替代不了
    leeg810312
        29
    leeg810312  
       275 天前
    我在 SQL Server 和 MySQL 里用过文本 Json 字段,我的体验是,系统设计中不需要这些字段有比较重度的索引、查询和聚合等需求,在数据库层面只是字段存储的话,是很合适的。我选择的 ORM 支持比较方便的自定义方式双向访问 JSON 字段数据和实体对象属性,可以在数据结构尚无法确定的阶段,将局部可能改变的字段先放到 JSON 字段里。推广到其他关系型数据库,我想应该也是适用的。现在做系统设计,倾向于将业务逻辑做在应用里,而不是数据库系统里,所以除了 JSON B 索引和查询优化,我是不会考虑利用 PG 关于 Json 字段特性的。
    Philippa
        30
    Philippa  
       275 天前 via iPhone
    json 功能很久了,性能提升不是刚需。pg 的 json 适合 sql 刚需偶尔有点动态数据的需求。另外因为 db 可 json ,代码里面的类型结构更要限得死死的。
    roundgis
        31
    roundgis  
       272 天前 via Android
    @yh7gdiaYW 很多用 mongodb 的项目就活不到需要重构的时候。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5620 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 03:00 PVG 11:00 LAX 19:00 JFK 22:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86