MongoDB 谨献给说MongoDB 这不好那不好的“古董” -- 发展与演进,从3 到 7 的卓越变化

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2300人左右 1 + 2 + 3 + 4 +5+6) 新人分配到6群,准备建立7 群。*(1 2 3 4 5 均没有空位了,请不要在问了谢谢)

MongoDB 谨献给说MongoDB 这不好那不好的“古董”  -- 发展与演进,从3 到 7 的卓越变化-1

MongoDB 从上次“大字报”的事情后,具体参见我和MongoDB不打不相识的过往,得到了一些官方的“小作文”,这里感谢MongoDB 架构师黄东旭老师的帮助,给了我一份MongoDB 编年史与技术变化的路线图的东西,写的是真好。这里狗尾续貂,把PDF的文字迁移到公众号上,让更多的人了解MongoDB的版本发展和进步的历程。

其实上次MongoDB 大领导来的时候我也提出疑问,这MongoDB是真佛系,传统数据库在国内都打成热窑了,各种攻击MongoDB 安全,性能,以及如何替代MongoDB的文章层出不穷,咱们这不争不抢的绅士风格是不是该change一下,不过想一下其实也不用,国内大部分情况都是 RDBMS处理不了的任务 转移到MongoDB, 还没有说MongoDB -> RDBMS的案例,(网上盛传的案例都是国外翻译而来的,一个英国卫报,一个不知名的什么企业)  ,人家大领导一句话,我们更关注于自己的产品如何更好的服务大众,欢迎友商DISS,我只能感叹真是高风亮节了, 都说要搞人设,或许心平气和也是一种自信的象征。

本篇让一些对MongoDB 有偏见的“知识落后”者来了解一下最新的MongoDB都有什么。千万别出现用明朝的剑斩杀新中国的官,这样有意思的事情,仅此而已。

喜欢吃瓜的,可以看下面两篇,我怎么和MongoDB 打起来的,以及后续

MongoDB 的一张“大字报”  服务客户,欢迎DISS

临时工说:炮轰阿里云MongoDB司令部 低质高价技术差 你是要疯!!!!

上来先驳斥一些“老顽固”的不思进取,说MongoDB 没有事务的问题。

1 MongoDB 4.0就支持多文档的事务了,支持多文档的 ACID 

2 MongoDB 4.2扩展了事务的支持,允许在分片集群中执行多个文档的事务,这类似于在mysql mycat中间件下的MYSQL分片支持跨库事务,问题是mysql在mycat中间件下,支持事务吗?

3 MongoDB 4.4 继续对事务进行改进,提高了分片上的事务可靠性和执行的效率。

然后咱们在驳斥一下说MonogDB 事务单一,不支持事务回滚。

1 MongoDB支持事务回滚 

2 操作简单,和我们在RDBMS 中一致,开启事务通过startsession 启动一个会话在会话中启动事务,然后你可以在这个会话里面进行任何的操作 

3 如果事务需要回滚,使用 abortTransaction 回滚事务,如果要 commit 就使用commitTransaction 来提交事务。

RDBMS有的,MongoDB这也有,千万别大惊小怪。下面奉送一段javascript的事务代码(感谢GPT 4o)

const { MongoClient } = require('mongodb');<br><br>async function run() {<br>    const client = new MongoClient('mongodb://localhost:27017', { useUnifiedTopology: true });<br><br>    try {<br>        await client.connect();<br>        const session = client.startSession();<br><br>        session.startTransaction();<br><br>        try {<br>            const usersCollection = client.db('mydatabase').collection('users');<br>            const ordersCollection = client.db('mydatabase').collection('orders');<br><br>            await usersCollection.insertOne({ name: 'Alice', age: 30 }, { session });<br>            await ordersCollection.insertOne({ item: 'Book', quantity: 1 }, { session });<br><br>            await session.commitTransaction();<br>            console.log('Transaction committed.');<br>        } catch (error) {<br>            await session.abortTransaction();<br>            console.error('Transaction aborted due to an error: ', error);<br>        } finally {<br>            session.endSession();<br>        }<br>    } finally {<br>        await client.close();<br>    }<br>}<br><br>run().catch(console.dir);<br>