聊聊mongodb数据库的设计和应用
MongoDB 是一个基于分布式文件存储的开源数据库系统,归类为NoSQL数据库,主要用于处理大量的文档型数据。MongoDB 使用类似JSON的格式存储数据,称为BSON(Binary JSON)。数据在MongoDB中以文档(documents)和集合(collections)的形式存在,文档类似于关系数据库中的数据库(db),而集合则类似于表(table)。
当前国内外使用 Mongodb 的大型实践越来越多,MongoDB 提供了重要的数据库存储服务,支撑着每天近千万级 QPS 峰值读写,数万亿级数据量存储服务。MongoDB 在高性能、动态扩缩容、高可用、易部署、易使用、海量数据存储等方面拥有很大优势。近些年,MongoDB 在 DB-Engines 流行度排行靠近榜单 Top5 ,且历年得分持续增长。之前公司的APP应用的详情数据,是单查mongodb的billion数量级。还有Crawler爬虫业务,从万到亿级别的数据能很好的动态半结构化入库。
在设计和应用MongoDB数据库时需要考虑以什么方面:
数据模型设计:MongoDB允许你灵活地设计数据模型,无需像关系数据库那样预先定义固定的表结构。这意味着你可以根据需求将数据嵌入到文档中或者使用引用链接到不同的文档。嵌入式文档可以降低查询开销,但可能增加数据重复;引用则可以节省空间,但可能增加查询时的联结计算。
文档的结构:MongoDB的文档结构是动态的,这意味着单一集合中的文档可以拥有不同的字段。这为数据的多样性提供便利,但同时也要注意文档的结构设计以避免未来难以维护和查询。
索引的使用:为了提高查询性能,需要为文档中的特定字段创建索引。与此同时要注意索引会消耗额外的磁盘空间且每个索引都需要在数据更新时进行维护,所以需要合理地选择需要索引的字段。
数据一致性:MongoDB支持不同级别的数据一致性。在设计数据模型时,应根据业务的特点和需求权衡数据的一致性、可用性和分区容忍度。例如,可以使用复制集提高数据的可用性和容错能力。
备份与恢复:应该制定并定期执行数据备份策略,以防数据丢失。MongoDB提供了多种备份和恢复工具,如mongodump和mongorestore。(我尝试在ubuntu mongo客户端使用,经常报错不能把数据mongodump下来,知道原因的小伙伴请留言呀。)
聊聊mongodb数据库的增删改查
MongoDB是一种文档导向的NoSQL数据库,它提供了丰富的功能来执行增删改查(CRUD)操作。以下是MongoDB中执行这些基本操作的简要概述:
1. 增(Create)
插入单个文档:db.collection.insertOne({ name: "John Doe", age: 30, address: "123 Elm Street" })
插入多个文档:db.collection.insertMany([ { name: "Jane Doe", age: 25, address: "234 Maple Avenue" }, { name: "Jim Brown", age: 40, address: "345 Oak Street" } ])
insertMany 方法允许一次性插入多个文档到集合中。
2. 删(Delete)
删除单个文档:db.collection.deleteOne({ name: "John Doe" })以上代码会删除集合中第一个匹配到 name 字段为 "John Doe" 的文档。
删除多个文档:db.collection.deleteMany({ age: { $lt: 30 } })这条命令用于删除所有 age 字段小于30的文档。
3. 改(Update)
更新单个文档:db.collection.updateOne( { name: "John Doe" }, { $set: { age: 31 } } )updateOne 方法用于更新找到的第一个文档。
更新多个文档:db.collection.updateMany( { age: { $lt: 30 } }, { $set: { status: "under 30" } } )updateMany 方法更新所有满足条件的文档,这里为所有 age 小于30的文档添加了一个新字段 status。
4. 查(Read)
查询单个文档:db.collection.findOne({ name: "John Doe" })
查询多个文档:db.collection.find({ age: { $gte: 30 } })
db.collection.find({age: { $gte: 30 }}).sort({age: 1}).limit(5).project({ name: 1, age: 1, _id: 0 })
在实际应用中,查询操作往往更为复杂,包含诸如排序(sort)、限制返回数量(limit)、投影(projection)等此查询会找到所有age大于等于30的文档,按age正序排序,只返回前5个结果,并且只包含 name 和 age 字段(排除 _id 字段)。增删改查中很多基本的操作和细节处理,这里案例大家一个总结图:数据库 - mongo
MongoDB的高阶操作包括几个方面
聚合操作(Aggregation):MongoDB提供了强大的聚合框架,可以对文档进行多个阶段的处理,包括筛选、分组、计数、求和等操作。通过聚合操作,可以实现复杂的数据分析和统计功能。
索引优化(Indexing):索引是MongoDB中提高查询性能的重要手段。通过创建合适的索引,可以加快查询速度,减少数据扫描的时间。MongoDB支持多种类型的索引,包括单字段索引、复合索引、文本索引等。
事务处理(Transactions):MongoDB从版本4.0开始支持多文档事务处理,可以确保多个操作的原子性和一致性。通过事务处理,可以实现复杂的数据操作,保证数据的完整性。
分片集群(Sharding):MongoDB支持数据分片,可以将数据分布到多个节点上,实现水平扩展。通过分片集群,可以处理大规模数据存储和高并发访问的需求。
mongodb中聚合操作介绍
MongoDB中的聚合操作是一种用于处理数据的强大工具,可以对数据进行筛选、分组、计算等操作。聚合操作通常用于处理大量数据,并生成汇总结果。
在进行聚合操作时,可以使用多个阶段来处理数据。每个阶段都可以对数据进行不同的操作,例如筛选、分组、排序等。常用的聚合操作包括match、group、sort、project等。以下给出聚会查询的一些案例详情图和连接:数据库,数据结构 - mysql, mongodb, redis, es
为了提高聚合操作的效率,可以采取以下几种优化策略:
使用索引:在进行聚合操作时,可以使用索引来加快数据的检索速度。通过在需要聚合的字段上创建索引,可以减少数据的扫描时间,提高查询效率。
限制数据量:在进行聚合操作时,可以通过筛选条件来限制数据量,减少需要处理的数据量,从而提高操作的效率。
使用投影操作符:在进行聚合操作时,可以使用投影操作符来只返回需要的字段,减少数据传输的开销,提高操作的效率。
合理设计聚合管道:在设计聚合管道时,可以合理选择阶段的顺序和操作符,避免不必要的计算和数据传输,提高操作的效率。
与关系型数据库的对比
灵活的文档模型:MongoDB的文档模型比传统的表结构要灵活得多,能够更自然地表示数据。这意味着可以存储更加复杂的数据类型,且数据结构可以随时调整,无需修改现有的数据。
易于入门:MongoDB的安装和配置相对简单,其数据的JSON式表示和丰富的文档,让新用户很容易上手。
易于扩展:MongoDB支持自动分片,从而提供出色的水平扩展能力。可以通过添加更多服务器来应对数据量增长和读写负载,这对于Web应用、大数据解决方案和云计算环境尤其重要。
高性能:MongoDB提供了高性能的数据存取,特别是在读写操作和对大量数据的处理上非常有效。它的索引机制可提供快速查询响应,并且支持复制和分片以提高读写性能。
复制和高可用性:通过复制集特性,MongoDB可以提供数据的多副本,确保高可用性和数据冗余。在一个复制集中,数据会自动复制到多个服务器,这样即便单个服务器故障,数据库仍然可以正常提供服务。
比较丰富的查询语言:MongoDB有一个丰富的查询语言,包括文本搜索、聚合管道以及地理空间查询等高级功能。它还提供了多种索引类型,如全文索引、地理空间索引等,用以优化特定类型的查询。
缺点: 1.如生态还在完善;特别当处理分布式任务时。2.关联查询能力弱;3.三方数据库关联工具兼容性差。例如DBeaver,只有在Ultimate版中能方便一点操作mongo,且有不少查询bug。navicat需要15后的专业版才能支持操作。最后MongoDB提供了多种编程语言的驱动程序,包括Java、Python、Node.js、C#、PHP等,方便开发者集成和使用。MongoDB有一个活跃的社区和丰富的生态系统,虽然和MySQL这种关系型的相比还存在差距。
欢迎点赞,收藏,打赏
参考:
https://www.processon.com/view/61e02ffde0b34d1be7f16460
https://www.processon.com/view/63ade98a950a3501fbed2758