首先咱们得晓得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就相当于这样一层嵌套着一层的表

而mongoDB来讲就是对象嵌套着对象:

在这里多嘴一句吧:咱们学习mongo的时候,首先要了解分明它的概念。首先启动服务器,就通知数据库要往哪里存。服务器能够寄存有多个数据库,而数据库就像是一所学校一样,数据库里要寄存着一个一个的汇合,相似于数组一样的,(这不是废话,认真)而汇合里寄存着文档,文档说白了就是最终的数据。汇合相当于学校的各个班级,而文档就相当于各个班级里的学生。


启动mongoDB的服务器并且关上mongo的shell,shell的意思就和你的bash和zhr一样,间接对利用底层操作,只不过bash和zhr的对象是整个电脑,而mongo的shell就只是对于mongo而已,在这个shell上输出相干命令并不是操作服务器,而是操作数据库。

<hr/>

三.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

同时插入多个对象,用数组[{},{}]的形式

插入一个或多个



和insert()性能一样,只是为了语义更加清晰。

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.updateManyds.collection.unpdateOne

4.删除 remove
db.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(),这样会把这个汇合整个都删除掉,相当于内存中不存在这个变量了。

tips:删除数据库是没有db.drop()这个办法 有本人的专属办法.db.deleteDatabase(),db.colection.drop()在应用的时候,如果这个汇合是该数据库最初一个,则默认清空内存中数据库的地址,相当于删除了整个数据库。