MongoDB快速上手,聊聊这款火了一阵又销声匿迹的非关系型数据库

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 事情的起因要从最近的一个新产品说起,最近部门有一个新的大数据产品规划,在考虑技术实现时,有一个动态表字段扩展的需求,比如原来表结构里只有a、b字段,需要不断的往里新增c、d、e等等字段,并且数据量也特别大。

听说微信搜索《Java鱼仔》会变更强哦!


本文收录于githubgitee ,里面有我完整的Java系列文章,学习或面试都可以看看哦


概述


事情的起因要从最近的一个新产品说起,最近部门有一个新的大数据产品规划,在考虑技术实现时,有一个动态表字段扩展的需求,比如原来表结构里只有a、b字段,需要不断的往里新增c、d、e等等字段,并且数据量也特别大。


于是就去寻找实现方案,针对这种数据模型无法确定的情况,非关系型数据库是比较合适的,于是找到了MongoDB。虽然最后选择了使用ES来实现,但是在这段时间也把MongoDB摸了一遍,今天就分享一下。


(一)MongoDB业务场景介绍


一般在技术选型时,我们会把数据库的第一选择给Mysql,但是关系型数据库在某些场景下的效率和存储能力会不及非关系型数据库。比如:


对数据库有高并发操作或者对海量数据的高效存储和访问。但是MongoDB就可以很好的应对这些场景。


在技术选型时,如果遇到下面的情况:


  1. 数据量大


  1. 读写操作频繁


  1. 对事务等要求性不高


  1. 数据模型无法确定


  1. 需求中有大量的位置查询,文本查询

这个时候我们就可以选择使用MongoDB。


(二)MongoDB介绍


MongoDB是一个开源、高性能、无模式的文档型数据库,属于非关系型数据库的一种,MongoDB中的数据结构类似于JSON,它可以存储比较复杂的数据类型。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。


(三)MongoDB基本增删改查


3.1 数据库操作


创建数据库:


use 数据库名

查看所有的数据库:

show databases

展示当前正在使用的数据库

db

db

db.dropDatabase()

3.2 集合操作


mongodb中的集合类似于关系型数据库中的表,在关系型数据库中,需要先创建表结构才能往里面写入数据,在mongodb中既可以先创建集合,也可以不创建集合,直接插入数据后自动创建集合。

主动创建集合方式:

db.createCollection("test")

查看集合:

show collections

删除集合:

db.test.drop()

3.3 文档操作


文档就是关系型数据库中的数据了,文档的数据结构和JSON十分相似,在mongodb中被称为BSON。在插入时,可以指定文档的id:“_id:1”,如果不指定就会自动生成一个id 单个文档插入

db.test.insert({"userName":"javayz","age":24})

多个文档插入

db.test.insertMany([{"userName":"javayz","age":24},{"userName":"javayz2","age":24}])

普通文档查询

#查询全部的文档
db.test.find()#按条件查询文档
db.test.find({"age":24})#投影查询,第一个JSON是查询条件,第二个JSON是展示字段,value为1表示展示,为0表示不展示
db.test.find({"age":24},{userName:1})

文档更新

#第一个query是查询条件,第二个update是更新条件,第三个options是更新的一些参数
db.collection.update(query,update,options)

文档更新分为覆盖更新和局部更新,所谓覆盖更新,就是指更新之后会把整条数据覆盖;局部更新是指就更新某个字段。


覆盖更新


通过下面的语句,会把test中对应id的文档变成只有age:25一个字段

db.test.update({_id:ObjectId("609419a54a3b1de79b6e4c5e")},{age:NumberInt(25)})

局部更新: 局部更新可以通过$set来实现,局部更新某一个字段

db.test.update({_id:ObjectId("609419a54a3b1de79b6e4c5f")},{$set:{age:NumberInt(25)}})

批量更新


批量更新需要添加第三个options参数:

db.test.update({age:25},{$set:{userName:'aabb'}},{multi:true})

options还可以选填以下几个参数:

upsert  可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi  可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern 可选,抛出异常的级别。

文档删除

删除符合记录的文档:
db.test.remove({age:24}})删除所有文档:
db.test.remove({})

文档统计


统计可以通过count方法进行数量统计,query中可添加查询条件

db.test.count(query)

文档分页


在需要展示的场景下就离不开分页,mongoDB提供了skip+limit的方式实现分页查询。比如下面这段逻辑实现每页十条进行分页:

db.test.find().skip(0).limit(10)db.test.find().skip(10).limit(10)db.test.find().skip(20).limit(10)

文档排序


有分页就会有排序,通过sort实现排序效果,下面的操作实现对a字段升序,对b字段降序:

db.test.find().sort({a:1,b:-1})

(四)文档复杂查询


前面介绍了基本的增删改查操作,下面介绍一些相对复杂的查询操作。


4.1 正则查询


mongoDB支持正则表达式查询,语法如下:


db.集合.find({字段:/正则表达式/})

比如要查询以aa开头的用户名:

db.test.find({userName:/^aa/})

4.2 比较查询


比较查询用来实现小于、小于等于、大于、大于等于、不等于的操作,语法如下:


db.集合.find({字段:{$gt:value}})  大于
db.集合.find({字段:{$gte:value}})  大于等于
db.集合.find({字段:{$lt:value}})  小于
db.集合.find({字段:{$lte:value}})  小于等于
db.集合.find({字段:{$nt:value}})  不等于

4.3 in查询


in用于实现包含查询:


db.test.find({userid:{$in:["001","002"]}})

不包含可以实用$nin实现。


4.4 条件查询


条件查询用来实现and和or查询,在mongodb中通过and和and和andor实现条件查询。


比如我想实现 where age>24 and (userName='aa' or userName='bb'),mongoDB实现如下

db.test.find({$and:[{age:{$gt:24}},{$or:[{userName:"aa"},{userName:"bb"}]}]})

(五)MongoDB索引


在Mysql中,如果数据量大的时候加索引和不加索引查询效率可能可以相差百倍,MongoDB也是。在没有索引的情况下MongoDB必须执行全集合扫描,针对集合中的字段适当添加索引可以极大地提高查询效率。MongoDB中索引使用B树结构。


MongoDB中提供了多种索引类型,常用的有单字段索引和复合索引,另外还支持地理空间索引、文本索引、哈希索引。


5.1 索引操作


查看索引:


db.集合.getIndexes()

结果如下:

[{"v":2,"key":{"_id":1},"name":"_id_","ns":"test.test"}]

其中key表示索引字段为_id,是升序索引;name表示索引名称是_id_;ns表示命名空间,是test这个库下的test集合里。


5.2 创建索引


创建索引的语法如下:

db.集合.createIndex(keys, options)

比如创建一个复合索引,通过age升序,name降序:

db.test.createIndex({"age":1,"name":-1})

options为可选字段:


网络异常,图片无法展示
|


5.3 删除索引


可以删除指定的索引或者所有索引,不指定index就是删除所有索引:

db.集合.dropIndex(index)

其中index中的内容可以索引的名称也可以是索引的规范:

db.test.dropIndex({"age":1,"name":-1})

(五)总结


MongoDB曾经在国内火了一阵,但是随着后来MySQL、ElasticSearch、Redis以及后来的大数据崛起,使用这款数据库的公司越来越少,但是这款数据库依旧有它的价值所在。我是鱼仔,我们下期再见!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2天前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
26 15
|
10天前
|
存储 NoSQL 关系型数据库
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
2月前
|
存储 NoSQL MongoDB
MongoDB 数据库引用
10月更文挑战第20天
23 1
|
2月前
|
存储 NoSQL MongoDB
基于阿里云数据库MongoDB版,微财数科“又快又稳”服务超7000万客户
选择MongoDB主要基于其灵活的数据模型、高性能、高可用性、可扩展性、安全性和强大的分析能力。
|
2月前
|
存储 NoSQL MongoDB
mongodb的数据库表怎么创建
在此过程中,理解并掌握这些基本操作,是深入探索MongoDB魅力,乃至构建高效数据解决方案的关键所在。通过实践,您将更加深刻地体会到这种随需应变的数据管理模式带来的便利与效率提升。
43 0
|
2月前
|
存储 NoSQL MongoDB
小川科技携手阿里云数据库MongoDB:数据赋能企业构建年轻娱乐生态
基于MongoDB灵活模式的特性,小川实现了功能的快速迭代和上线,而数据库侧无需任何更改
|
2月前
|
运维 NoSQL BI
简道云搭载阿里云MongoDB数据库,帮助数以万计企业重构业务系统
通过与MongoDB和阿里云团队的合作,让简道云少走了弯路,保障了线上服务的长期稳定运行,提高了吞吐效率,并相应降低了线上运行成本
|
12天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
82 15
下一篇
DataWorks