开头还是介绍一下群,如果感兴趣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不打不相识的过往,得到了一些官方的“小作文”,这里感谢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');
async function run() {
const client = new MongoClient('mongodb://localhost:27017', { useUnifiedTopology: true });
try {
await client.connect();
const session = client.startSession();
session.startTransaction();
try {
const usersCollection = client.db('mydatabase').collection('users');
const ordersCollection = client.db('mydatabase').collection('orders');
await usersCollection.insertOne({ name: 'Alice', age: 30 }, { session });
await ordersCollection.insertOne({ item: 'Book', quantity: 1 }, { session });
await session.commitTransaction();
console.log('Transaction committed.');
} catch (error) {
await session.abortTransaction();
console.error('Transaction aborted due to an error: ', error);
} finally {
session.endSession();
}
} finally {
await client.close();
}
}
run().catch(console.dir);
在驳斥了谬论后,咱们说说正题
首先要说明的是,目前正式的MongoDB的生产可用版本是 7.X,但我周围和我了解的群里的小伙伴们的MongoDB 还有的在 3.X , 4.X ,少有5.0或更高的版本,这里用简述的方式来进行MongoDB的功能简单罗列,让大家能清晰的看到MongoDB的发展路程。
MongoDB 3.0-3.2
这个版本的MongoDB 我没有用过,这个版本是MongoDB是在2015年开始推行的版本,其中这个版本的功能已经有了 $lookup 功能以及可以搭建小于50个副本的复制集合的功能的MongoDB的版本。这个版本中已经引入了引擎 wiredTiger ,与mmapv1数据库引擎同时在MongoDB的数据库中。这个版本的数据库已经支持了,分片,管道,默认的数据库引擎还是MMAPV1。
MongoDB 3.4
这个版本是我第一次使用MongoDB的版本,这个版本的MongoDB 引入了图形处理功能,通过$graphlookup 聚合来处理图形数据中链接关系,并且加入了读偏好的选项,这期间复制集的功能变得强悍,对于选举的机制进行了改进,并且准备将数据库的引擎从MMAPV1 迁移到 WiredTiger数据库引擎上,并添加了文档的验证功能,也就是我们传统数据库上的约束,提升了数据查询的能力和速度增加了数据加密和传输加密的功能。
MongoDB 3.6
这个版本是曾经长时间使用的一个版本,并且这个版本现在还有很多企业在用,这个版本中的一些特性非常有用,必然引入了会话的概念,允许在多个操作之间共享上下文,引入了$facet操作允许多维度的数据分析,增加了地理空间查询的能力,改进了聚合的框架,将分片的管理和性能进行了提升。同时还有如IP 白名单,因果一致性,对数组更新的速度的提升。
MongoDB 4.4
支持跨分片的事务,允许多个分片对多个文档,跨集合,跨分片的事务处理,确保事务的一致性,添加了更多的聚合操作如
accumulator, $function 等对于聚合管道的灵活性有所加强,支持多字段索引提高查询能力,对于索引建立中如果有失败的情况,可以在失败后重新构造索引。对于写的的性能也有优化和提升,对时序的序列进行了优化。
MongoDB 5.0
客户可以选定使用的API,保证更新版本后的客户端的兼容性,减少版本更新后API更换的导致的DOWN机时间,提供了时序集合的支持,优化了时间戳数据的存储和查询,对于物联网的场景有强有力的支持,对于金融场景中日志的记录也有强有力的支持,并且5.0中解决了MongoDB分片中最大的一个问题,实时重新分片,更好的管理分片数据的平衡性,在索引上也进行了改进,对于通配符和复合索引有了更强的支持,提供了实时备份的功能,可以恢复到任意指定时间点,同时也给出了新的客户端的工具 mongoshell
所以在整体的版本中,5.0 是一个重大功能的更新点也是版本功能的一个重要的分割线。2022后MongoDB的版本更新速度,明显是加速了,后续2023 2024推出了 MongoDB 6.0 MongoDB 7.0
MongoDB 6.0
MongoDB 6.0 引入了新的查询引擎SBE(slot-based execution),这是MongoDB 6.0最大改进,通过新的查询引擎的加入,针对复杂查询和大数据集查询,新的引擎查询优势明显,并且优化了数据存储和检索的性能,进一步增强了时序数据支持,提高了时序数据的存储和查询性能,对于副本集初始化方式进行了提高.
MongoDB 7.0
MongoDB 7.0 持续更新在对原有的数据写入性能和查询优化性能,索引机制持续优化的情况下,扩展了对于新硬件的支持,如针对ARM环境下的架构硬件的支持,对于ARM环境下的硬件产品进行了更多的适配,同时优化了存储引擎对于NVMe SSD的优化,提升了数据的读写速度和整体的性能,同时针对云上的atlas 产品提供了serverless instance的服务,可以根据工作复杂动态扩展,并且在AWS,AZURE,GOOGLE CLOUD等多云环境下MongoDB 的数据管理和迁移的能力。
总体来说,前两天看了几篇国外2024分析数据库市场的文章,也在群里贴过(5群),NoSQL的市场是不大14-15%,可在不大这也是市场,竞争小压力小,70-80%的市场是 RDMBS可卷的有多厉害,圈内的都知道,截止目前NoSQL的市场MongoDB 说2 ,那个敢接1 ,RDBMS数据库产品中的NoSQL支持,只能是瘸子给赛跑运动员撑场面,你还没有那个资格。
MongoDB 还有其独特的用法,如GridFS 将MongoDB 作为分布式文件存储系统,哪个传统的RDBMS 可以拿来当分布式文件存储用,PG 的地理位图POSTGIS业界第一 ,MonogDB 也有自己的地理位图功能,能和POSTGIS 掰掰手腕不是别的数据库是MongoDB的地理位图功能 GeoJson, 时序数据处理MongoDB 也是专业的。
时序数据的应用场景
-
物联网(IoT):传感器数据监控和分析。
-
金融市场:股票价格、交易量等金融数据分析。
-
服务器监控:日志数据分析,服务器性能监控。
-
环境监测:气象数据、污染物浓度监测。
相当于一个MongoDB可以支持除了二维表格以外的大部分需求,更专业,原生的分布式存储让数据更安全,在还在烦恼,怎么搭建高可用,怎么做负载均衡的时候,MongoDB天生的具有的能力,也没见拿着这个把柄耻笑RDBMS的 “弱鸡”,互相尊重才能更好的发展,展现自己的能力不只有互相诋毁这一种方法。