一篇文章搞懂MongoDB数据库
十年生死两茫茫,不思量,自难忘。千里孤坟,无处话凄凉。纵使相逢应不识,尘满面,鬓如霜。
夜来幽梦忽还乡,小轩窗,正梳妆。相顾无言,惟有泪千行。料得年年肠断处,明月夜,短松冈。
一、初识MongoDB
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为:Field
就此我们引出了三个关键字,Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目",Field就是"字段"
二、MongoDB的安装
安装教程:https://www.jianshu.com/p/fdd2f93858d0
三、MongoDB的基本操作
- 创建数据库(这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间)
show dbs 查看所有数据库
use wangjifei(表名)
show tables 查看所有数据表
- 创建数据库(这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间)
MongoDB设计的比较随意,没有就认为你是在创建,use user是不存在的,所以MongoDB就认为你是要创建并使用user表。
这个概念一定要记清楚哦,MongoDB中如果你使用了不存在的对象,那么就等于你在创建这个对象哦
- 表(Collection)中添加数据(insert insertOne insertMany)
-- insert:插入一条或者多条数据,需要带有允许插入多条的参数,这个方法目前官方已经不推荐喽
db.wangjifei.insert({"name":"wangjifei"})
-- insertOne: 插入一条数据,官方推荐
db.wangjifei.insertOne({"name":"gaoliang"})
-- insertMany:插入多条数据,无需参数控制,官方推荐
db.wangjifei.insertMany([{"name":"wangjifei1"},{"name":"wangjifei2"}])
- 表(Collection)中添加数据(insert insertOne insertMany)
- 查询:(MongoDB 之 查询数据(find findOne) 之 这里没有findMany)
db.wangjifei.find() 无条件查找:将该表(Collection)中所有的数据一次性返回
db.wangjifei.find({"name":"wangjifei"}) 条件查找:name等于WuSir2b的数据
db.wangjifei.findOne() 无条件查找一条数据,默认当前Collection中的第一条数据
db.wangjifei.findOne({"name":"wangjifei"}) : 条件查找一条name等于wangjifei的数据,如有多条数据则返回更靠前的数据
- 查询:(MongoDB 之 查询数据(find findOne) 之 这里没有findMany)
- 修改数据(update updateOne updateMany)
db.wangjifei.update({"查询条件"},{$set:{"修改的内容"}}):根据条件修改该条数据的内容,如果条件为空,那么将会修改Collection中所有的数据
db.wangjifei.updateOne({"查询条件"},{$set:{"修改的内容"}}):根据条件修改一条数据的内容,如出现多条,只修改最高前的数据
db.wangjifei.updateMany({"查询条件"},{$set:{"修改的内容"}}):根据条件修改所有数据的内容,多条修改
$set:{"name":"xxx"}我还是要解释一下: $set 是update时的关键字,表示我要设置name属性的值为"xxx"。
那么我们之前说过MongoDB的灵活性,没有就代表我要创建,所以说如果该条Documents没有name属性,他就会自动创建一个name属性并且赋值为"xxx"
- 修改数据(update updateOne updateMany)
- 删除数据(remove)
remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
remove({"name":"wangjifei"}) : 条件删除name等于"wangjifei"的所有Document
deleteOne({}) 条件删除某个数据
deleteMany({}) 条件删除所有符合条件的数据
db.wangjifei.drop() 清空Collection,不能删除单个数据
- 删除数据(remove)
四、MongoDB的数据类型
- 所有数据类型
Object ID :Documents 自生成的 _id
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型) - 剖析MongoDB的数据类型
1.Object ID :这是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个字节组成:0-8字节是时间戳;9-14字节的机器标识符,表示MongoDB实例所在机器的不同;15-18字节的进程id,表示相同机器的不同MongoDB进程;19-24字节是计数器。
2.String :UTF-8字符串,记住是UTF-8字符串。
3.Boolean :true or false 这里首字母是小写的。
4.Integer :整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)。
5.Double :浮点数 (MongoDB中没有float类型,所有小数都是Double)。
6.Arrays :数组或者列表,多个值存储到一个键。
7.Object :学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
8.Null :空数据类型 , 一个特殊的概念,Null
9.Timestamp :时间戳
10.Date :存储当前日期或时间格式 (我们一般很少使用这个Date类型,因为时间戳可以秒杀一切时间类型)
五、MongoDB 的$关键字及$修改器
MongoDB中类似这样的关键字有很多, $lt $gt $lte $gte $set $inc $push $pull $pop等等,这么多我们也不方便记,这里我们说说几个比较常见的
- 查询中常见的 等于 大于 小于 大于等于 小于等于
-- 1.等于 : 在MongoDB中什么字段等于什么值其实就是 " : "
db.wangjifei.find({"name":"wangjifei"})
-- 2.大于 : 在MongoDB中的 大于 > 号 我们用 : $gt
db.wangjifei.find({ "score" : { $gt : 80 } })
-- 3.小于 : 在MongoDB中的 小于 < 号 我们用 : $lt
db.wangjifei.find({ "score" : { $lt : 80 } })
-- 4.大于等于 : 在MongoDB中的 大于等于 >= 号 我们用 : $gte
db.wangjifei.find({ "score" : { $gte : 80 } })
-- 5.小于等于 : 在MongoDB中的 大于等于 <= 号 我们用 : $lte
db.wangjifei.find({ "score" : { $lte : 80 } })
这就是MongoDB中的运算符,是不是很类似我们使用的ORM中的运算符啊,没错,最开始的时候我们就已经说了,MongoDB的操作就是很类似ORM的
-- $all 满足所有元素的数据
db.wangjifei.find({"text_list":{$all:[1,3]}})
-- $in满足其中一个元素的数据
db.wangjifei.find({"text_lisst":{$in:[1,3]}})
-- $or 满足其中一个字段的数据
db.wangjifei.find({$or:[{name:"wangjifei"},{age:{$gt:70}}]})
- 查询中常见的 等于 大于 小于 大于等于 小于等于
- update修改器: $inc $set $unset $push $pull
在此前的update中,我们用过$set,对数据进行过更新,其实在update中还存在很多的$关键字,我们把update中的这些关键字叫做修改器
-- 1.$inc : Python中的 变量 += 1 , 将查询到的结果 加上某一个值 然后保存
db.wangjifei.update({"score":60},{$inc:{"score":10}})
-- 2.$set : 此前我们已经提到过 $set 的用法和特性(没有就自动添加一条)
db.wangjifei.update({"查询条件"},{$set:{"修改的内容"}})
-- 3.$unset : 用来删除Key(field)
db.wangjifei.update({"score":60},{$unset:{"age":1}})
-- 4.$push : 它是用来对Array (list)数据类型增加新元素
db.wangjifei.updateMany({"score":60},{$push:{"test_list" : 6}})
-- 5.$pull :就是指定删除Array中的某一个元素
db.wangjifei.updateMany({"score":60},{$pull:{"test_list" : 6}})
如果 Array 数据类型中 如果有多个6时,只要满足条件,就会将Array中所有满足条件的数据全部清除掉
-- 6.$pop : 指定删除Array中的第一个或最后一个 元素
db.wangjifei.updateMany({"score":60},{$pop:{"test_list" :1}})
db.wangjifei.updateMany({"score":60},{$pop:{"test_list" :-1}})
其中 -1 代表删除list的最前面元素, 1代表删除list的最后边元素 (这和我们大Python正好相反)
- update修改器: $inc $set $unset $push $pull
六、MongoDB 之 "$" 的奇妙用法
在MongoDB中有一个非常神奇的符号 "$";"$" 在 update 中 加上关键字就变成了修改器,其实 "$"字符独立出现也是有意义的 , 叫做代指符
- 对应 Array 中的下标进行修改
db.wangjifei.updateMany({"score":60},{$set :{"test_list.0" : 9}}) 这样就是将 test_list的index=0的元素改为9
- 一个很长很长的Array你要查找其中一个值,把这个值修改
db.wangjifei.updateMany({"score":60,"test_list" :119},{$set :{"test_list.$" : 911}}) 这样就是将 test_list的119元素改为911了
$字符在语句中代表了查询出的Array数组中某个值的索引或者是下标
七、MongoDB的查询结果集的相关操作
- limit(x):只查询前x条数据
- skip(x):跳过前x条数据
- sort({ id:-1 }):根据id字段进行倒序排列:-1 正序排列:1
db.wangjifei.find({}).sort({ id:-1 }).limit(3).skip(6)
更多MongoDB的Array和Object的特殊操作请参考
https://www.cnblogs.com/DragonFire/p/9147430.html
一篇文章搞懂MongoDB数据库相关推荐
- 一篇文章搞懂mysql数据库底层数据存储逻及保存数据过程
前沿: 我们知道mysql数据和结构都存储在磁盘,这样才能保证数据的持久性,那么数据和结构是如何存储的呢?这就是今天我们要讨论的话题. 正文: 数据库有俩个文件,一个是以.frm结尾的文件,另外一个是 ...
- c++ 计算正弦的近似值_一篇文章搞懂正弦保真性
本文介绍数字信号处理中"正弦保真性"这一概念,想要更好地理解本文所述内容,建议读者先阅读<一篇文章搞懂卷积>. 正弦保真性定义 一个正弦信号作为线性时不变系统的输入时, ...
- 一篇文章搞懂filebeat(ELK)
一篇文章搞懂filebeat(ELK) https://www.cnblogs.com/zsql/p/13137833.html 目录 一.filebeat是什么 1.1.filebeat和beats ...
- 一篇文章搞懂架构师的核心技能
" 这是架构师系列的第一篇:核心技能,希望这个系列能完全揭示架构师这个职位:我先从核心技能开始,后续还有架构师之路,架构实战等架构师系列文章. 本文作者 陈睿 优知学院创始人,前携程定制旅游 ...
- 【一篇文章搞懂】什么是分布式锁?为什么要用分布式锁?看这篇文章准没错!
简介 HikariCP 是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,和 dr ...
- 组件化开发实战_一篇文章搞懂什么是前端“组件化”开发
学过网页的朋友都知道,制作一个网页离不开HTML.CSS和JavaScript技术.对于初学者来来说,掌握这3门技术就已经很不容易了,为什么前端为什么又要搞出来一个"组件化"开发的 ...
- reactrouter监听路由变化_一篇文章搞懂前端路由原理解析和实现方式
在单页应用如此流行的今天,曾经令人惊叹的前端路由已经成为各大框架的基础标配,每个框架都提供了强大的路由功能,导致路由实现变的复杂. 想要搞懂路由内部实现还是有些困难的,但是如果只想了解路由实现基本原理 ...
- 一篇文章搞懂STL中的空间配置器allocator(原创,多图,易懂)
Table of Contents 0.引入 1.标准的空间配置器allocator 2.更为高效的空间配置器alloc 2.1----对象的构造与析构 2.1.1 对象的构造:::construct ...
- 一篇文章搞懂算法基础
源码地址 https://github.com/javanan/DataStructure 目录 时间复杂度介绍 空间复杂度介绍 递归算法与非递归算法区别和转换 折半查找/二分查找算法 链表实现 反转 ...
最新文章
- 爬虫的系统框架组成-解析器
- java编写限制密码_java – 用户’root’@’localhost’拒绝访问(使用密码:YES)
- 1080 线段树练习
- Spring Cloud构建微服务架构(四)分布式配置中心
- openresty开发系列23--lua面向对象
- 租不起房!你离逃离北上广还有多长时间?
- 【数据分析】数据缺失影响模型效果?是时候需要missingno工具包来帮你了!
- PHP学习总结(14)——PHP入门篇之常用运算符
- linux 文件重命名或文件移动
- php mysql 正则表达式_mysql正则表达式(Regexp)的示例详解
- python中生成器的两段代码
- 测视力距离5米还是3米_多功能视力表灯箱的用法
- 宁夏大学新华学院08计算机马宁,公 示
- R语言神经网络与深度学习(一)
- oracle 手动执行作业,ORACLE 作业操作
- 系统集成项目管理工程师06《项目成本管理》
- Java注解中produces啥意思_SpringBoot常用注解
- 如何根据样本估计总体的均值、比例与方差?如何进行参数估计及选择对应公式?
- 【JAVA】java递归测试考拉兹猜想/冰雹猜想
- 限时删,2020 CSDN 博客之星排名泄露