一篇文章搞懂MongoDB数据库

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 十年生死两茫茫,不思量,自难忘。千里孤坟,无处话凄凉。纵使相逢应不识,尘满面,鬓如霜。夜来幽梦忽还乡,小轩窗,正梳妆。相顾无言,惟有泪千行。料得年年肠断处,明月夜,短松冈。

十年生死两茫茫,不思量,自难忘。千里孤坟,无处话凄凉。纵使相逢应不识,尘满面,鬓如霜。
夜来幽梦忽还乡,小轩窗,正梳妆。相顾无言,惟有泪千行。料得年年肠断处,明月夜,短松冈。

一、初识MongoDB

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为:Field

就此我们引出了三个关键字,Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目",Field就是"字段"

二、MongoDB的安装

安装教程:https://www.jianshu.com/p/fdd2f93858d0

三、MongoDB的基本操作

    1. 创建数据库(这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间)
      show dbs 查看所有数据库
      use wangjifei(表名)
      show tables 查看所有数据表

MongoDB设计的比较随意,没有就认为你是在创建,use user是不存在的,所以MongoDB就认为你是要创建并使用user表。
这个概念一定要记清楚哦,MongoDB中如果你使用了不存在的对象,那么就等于你在创建这个对象哦

    1. 表(Collection)中添加数据(insert insertOne insertMany)
      -- insert:插入一条或者多条数据,需要带有允许插入多条的参数,这个方法目前官方已经不推荐喽
      db.wangjifei.insert({"name":"wangjifei"})
      -- insertOne: 插入一条数据,官方推荐
      db.wangjifei.insertOne({"name":"gaoliang"})
      -- insertMany:插入多条数据,无需参数控制,官方推荐
      db.wangjifei.insertMany([{"name":"wangjifei1"},{"name":"wangjifei2"}])
    1. 查询:(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的数据,如有多条数据则返回更靠前的数据
    1. 修改数据(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"
    1. 删除数据(remove)
      remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
      remove({"name":"wangjifei"}) : 条件删除name等于"wangjifei"的所有Document
      deleteOne({}) 条件删除某个数据
      deleteMany({}) 条件删除所有符合条件的数据
      db.wangjifei.drop() 清空Collection,不能删除单个数据

四、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. 查询中常见的 等于 大于 小于 大于等于 小于等于
      -- 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}}]})
    1. 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正好相反)

六、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数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
20天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
21天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
23天前
|
存储 NoSQL MongoDB
MongoDB 数据库引用
10月更文挑战第20天
14 1
|
29天前
|
存储 NoSQL MongoDB
基于阿里云数据库MongoDB版,微财数科“又快又稳”服务超7000万客户
选择MongoDB主要基于其灵活的数据模型、高性能、高可用性、可扩展性、安全性和强大的分析能力。
|
28天前
|
存储 NoSQL MongoDB
mongodb的数据库表怎么创建
在此过程中,理解并掌握这些基本操作,是深入探索MongoDB魅力,乃至构建高效数据解决方案的关键所在。通过实践,您将更加深刻地体会到这种随需应变的数据管理模式带来的便利与效率提升。
24 0
|
29天前
|
存储 NoSQL MongoDB
小川科技携手阿里云数据库MongoDB:数据赋能企业构建年轻娱乐生态
基于MongoDB灵活模式的特性,小川实现了功能的快速迭代和上线,而数据库侧无需任何更改
|
29天前
|
运维 NoSQL BI
简道云搭载阿里云MongoDB数据库,帮助数以万计企业重构业务系统
通过与MongoDB和阿里云团队的合作,让简道云少走了弯路,保障了线上服务的长期稳定运行,提高了吞吐效率,并相应降低了线上运行成本
|
9天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
23 4
|
7天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
20 1
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
82 1