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