首先我们得知道SQL是什么,structured qurey language结构化查询语言,它也是一门高级语言,就像js和java这种一样,它也是一门单独的语言。最初的时候我以为它只是一种代名词,一种概念而已,现在才发现自己大错特错。
一.数据类型
MongoDB存储的数据类型为BSON(Binary-json)二进制JSON数据。
二.和用SQL写出来的数据库对比
MongoDB是NOSQL的代表类数据库,not only SQL
MongoDB存储的数据类型为BSON(Binary-json)二进制JSON数据。
简单来说更像是面向对象的一种写法,让有其它面向对象语言基础的程序员学习成本更低。
举个例子来说,现在一个学校想统计所有年级的所有班级里的所有老师和学生姓名性别。如果用SQL来统计的话,就好像你在电脑桌面创建了一个文件夹,文件夹一层一层嵌套着文件夹这种格式,我打开学校这个文件夹,里面会出现·年级1,·年级2..类似这样的结构:
学校-->年级1/年级2/-->(打开年级1的文件夹)1班/2班/3班--->(打开1班)-->老师/学生-->(选择老师)-->物理老师/语文老师.....等等
table joins就相当于这样一层嵌套着一层的表
在这里多嘴一句吧:我们学习mongo的时候,首先要理解清楚它的概念。首先启动服务器,就告诉数据库要往哪里存。服务器可以存放有多个数据库,而数据库就像是一所学校一样,数据库里要存放着一个一个的集合,类似于数组一样的,(这不是废话,认真)而集合里存放着文档,文档说白了就是最终的数据。集合相当于学校的各个班级,而文档就相当于各个班级里的学生。
启动mongoDB的服务器并且打开mongo的shell,shell的意思就和你的bash和zhr一样,直接对应用底层操作,只不过bash和zhr的对象是整个电脑,而mongo的shell就只是对于mongo而已,在这个shell上输入相关命令并不是操作服务器,而是操作数据库。
三.mongoDB的基本命令
关于怎么安装我的往期文章有详解不再过多赘述。
1.显示所有数据库:show dbs(show databases)的简写
2.use xxx(数据库名称)我就以学校为例子吧
在mongoShell中输入use grade
,就会切换到grade 数据库
在这里可能会有疑问?我不是还没创建这个数据库吗,为什么就可以直接use呢?这是mongo的特性,当你使用use
命令的时候,如果这个数据库存在,那么他就会切换到这个数据库,如果这个数据库不存在,那么它就会帮你暂时自动生成,为什么叫暂时呢?因为只有让这个数据库开始存放集合和文档的时候,它才会真正生成存放到服务器上。
这时候你再使用一下 show dbs
我们发现其实grade并没有被放到服务器上。
3.db
命令
这个命令可以显示自己现在在那个数据库,和bash zsh的pwd
命令相似
4.show collections
看看数据库里有多少集合,就是看看有学校这个数据库多少班级
四.增删改查
CRUD相关操作,一个数据库最基本的作用就是增删改查了吧。C:create,R:read,U:update,D:delete
但是具体的操作并不是这几个单词。
1.增:新增一个数据db.collection.insert(doc)
use school
然后db.grade.insert({name:"韩振方",age:"18"})
db代表着当前数据库,grade是collection集合的名字,插入的就是我们的文档。
注意,这时候我们再查看db的数量,你会发现school出现在了上面。
再试试 show collections
同时插入多个对象,用数组[{},{}]
的方式
插入一个或多个
2.查:查询数据 db.collection.find()
如果没有自己设定_id
属性值,那么mongo会自动配置一个唯一的id值,且必须有下划线
提一嘴:你可能会想 那肯定有db.find(),collection.find(),我只能告诉你,show dbs show collections
不会刚看就忘吧?还不赶快自己去敲一敲?
find(arguments)
find也可以接受参数,参数为一个对象,返回值是一个数组!注意,这个和js中的array.find()不一样,js的find是返回第一个符合条件的属性和值,返回的是一个键值对对象
在mongo中这个条件会查询所有name
属性值是韩振方
的,然后返回,即便结果只有一个文档符合条件,也需要用[index]来调用里面的属性,味道有点像document.getElementByClassName()
和document.querySelectorAll()。
findOne()
这个查询方式返回值为健值对对象,可以直接调用里面的方法。类似于
document.querySelector()
3.改:确切的说是更新
db.grade.update()
这个方法接受两个参数,一个是查询条件对象,一个是新的对象。注意,第二个是一个新的对象,并不是单一的属性。
我们正常的逻辑就是,如果这样使用,你就把name修改成小方就行了,其它别给我动。但是它实际上执行的是把name:“韩一一”
这整个对象,替换成后面的对象。
那么如何到达我们实际上想要完成的目标呢?这里需要我们用到:“修改操作符” $set
比如我要修改第一个数据,把name改为:韩韩韩
而其它数据不改变。
上面第一行代码,就是$set:{}
的用法。和set相反的是$unset:{}
代表着删除某一个文档对象里的某个属性。
补充:update()默认只会修改文档中第一个符合搜索条件的文档对象,$set:{}
修饰符不仅仅只有修改的作用,如果查找的条件是name:"韩振方"
并且$set:{grade:"3"},
但是我并没有这条属性,那么set就会自动这个属性到这个文档对象上
拓建:ds.collection.updateMany
和ds.collection.unpdateOne
4.删除 removedb.collection.remove()
它接受一个文档的属性对象作为参数,它可以有第二个参数,我们先讲只有一个参数的默认情况。
现在我有两个name为xx
的数据,我remove({name:"xx"})
你先根据上面的增改查判断一些它是删除一个还是多个?
按照我们上面的逻辑,它肯定只是删除第一个!其实不然 它删除所有符合条件的。
如果只想要删除一个,有两种方法。
1.使用db.collection.deleteOne()
,不要问为什么不是removeOne()
我也在想!
2.或者给remove添加一个第二个参数remove({name:"xx"},ture)
第二个参数是布尔值属性为onlyOne,
补充:还有db.collection.deleteMany()
这个就是remove
默认的情况。
如果remove({})
传递一个空数组那么会把集合里所有文档删除,但是!!!注意,但是集合还在!内存中还有这个变量的位置,并且这种方法在底层运行逻辑是把文档对象一个一个删除,并不是一下子清空。
如果真的有需求,想要删除某个集合,那么建议直接db.collection.drop()
,这样会把这个集合整个都删除掉,相当于内存中不存在这个变量了。