一、MongoDB介绍
MongoDB是一个NoSQL数据库,它是跨平台的,基于分布式文件存储的数据库,由C++语言编写的(这点很重要,则表示在Linux下需要安装gcc环境)。MongoDB是以文档的形式存储数据,数据结构由键值(key:value)对组成,类似JSON。
MongoDB结构,最小的单位为文档(类似MySQL的行),每一个文档用的是BSON形式来存储(类似JSON),文档的上一层为集合(类似MySQL的表),再上一级为库(类似MySQL的数据库)。
二、MongoDB启动
1.参数说明
参数 | 描述 |
---|---|
–bind_ip | 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定,默认本地所有IP |
–logpath | 指定MongoDB日志文件 |
–logappend | 使用追加方式书写日志 |
–dbpath | 指定数据库路径 |
–port | 指定服务端口号,默认为27017 |
–serviceName | 指定服务名 |
–serviceDisplayName | 指定服务名(在多个MongoDB服务时执行) |
–install | 指定作为一个Windows服务安装 |
2.启动MongoDB服务器的方式
2.1进入MongoDB目录的bin目录中执行mongod.exe文件(命令行)
在执行命令前,先在F盘目录下创建/data/db
进入cmd控制台,进入mongodb的安装bin目录,执行命令
cd C:\Program Files\MongoDB\Server\4.0\bin mongod.exe --dbpath f:\data\db
启动成功后,会在指定的目录下生成数据库文件信息
2.2将MongoDB服务器作为Windows服务来运行
cd C:\Program Files\MongoDB\Server\4.0\bin mongod.exe --bind_ip 127.0.0.1 --logpath "f:\data\log\mongodb.log" --logappend --dbpath "f:\data\db" --port 27017 --serviceName "demo" --serviceDisplayName "demo" --install
在执行命令前需要创建对应的目录结构
进入cmd,执行命令(一定要以管理员的身份运行cmd控制台)
查看指定的mongodb的日志文件(即–logpath 指定的路径)
看日志文件,需要在命令行用[net start demo],启动mongodb
自动生成数据库的文件信息在F:/data/db
进程里mongod正在运行,如下图
2.3 bin文件下的exe文件功能
mongod.exe:启动MongoDB服务器
mongo.exe:启动MongoDB Shell
3.SQL术语和MongoDB术语比较
SQL术语 | MongoDB术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接(MongoDB不支持) | |
primary key | primary key | 主键(MongoDB自动将_id字段设置为主键) |
三、基本命令学习
1.db命令:查看当前操作的文档(数据库)
2.show dbs命令:显示所有数据的列表
3.use命令:连接到一个指定的数据库(如果数据库不存在创建数据库,否则打开该数据库。)
4.删除数据库:db.dropDatabase()
查看当前数据库为test1; 删除当前数据库;查看已有数据库内该数据库已经被删除成功。
5、从指定主机上克隆数据库
db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库
6、从指定的机器上复制指定数据库数据到某个数据库
db.copyDatabase(“mydb”, “temp”, “127.0.0.1”);将本机的mydb的数据复制到temp数据库中
7、修复当前数据库
db.repairDatabase();
8、查看当前使用的数据库
db.getName();
db; db和getName方法是一样的效果,都可以查询当前使用的数据库
9、显示当前db状态
db.stats();
10、当前db版本
db.version();
11、查看当前db的链接机器地址
db.getMongo();
按照上面的安装完成后,就可以使用MongDB了,操作的指令都是一样的,我自己使用的是Linux,所以下面都以Linux为例。
找到你安装MongDB目录,如果不知道,可以通过ps -ef | grep mongo 来查看mongodb所在的位置,在Linux下,MonggoDB是随着Linux一起启动的。如果你不小心关闭了,可以通过命令service mongodb start来启动服务(注意,此处的启动服务不是使用MongDB),通过命令 service mongodb stop关闭服务。
下面才是真正的使用MongoDB,上面已经教了怎么查找mongpdb的位置,找到位置之后呢,通过命令 ./mongo 进入到MongoDB的真正服务中,也就是到了此处才是真正的使用MongoDB。
总结一波:
pe -ef | grep mongodb 查看mongodb的目录和看是否启动
service mongodb start
启动mongodb服务
service mongodb stop
关闭mongodb服务
./mongo 真正使用mongodb服务
在mongodb中,我们就要学习mongodb 的指令了,类似于学习sql一样,注意:在MongoDB中,是区分大小写的,要特别注意这一点。
12、 先从库级别的指令开始:
> show dbs;
查看数据库,会显示当前的数据库,以及占用的内存大小。local 0.078125GB
注意:该命令不会显示空的数据库,也就是说你新建的数据库没数据是不会显示的。
> db
查看当前用户连接的是哪个库,没错就是这2个字符。test
> use xuye
创建一个库,名为xuyeswitched to db xuye
> use xuye
注意上面我们db查看当前库是test,现在我们切换到xuye这个库了。
switched to db xuye
use的命令有两个作用,一个是切换库,如果这个库不存在就是创建库。
> db 查看当前连接的库,此时使用的是xuye这个库。xuye
> db.dropDatabase() 删除当前连接的数据库,类似对对象调用方法的操作,db表示当前的用户{
"dropped" : "xuye", "ok" : 1 }
>dropDatabase()函数表示执行删除操作,下面的是返回值。
> show users 显示当前用户,没有数据则不显示
13、 集合(类似MySQL的表级别)级别的指令:
需要注意的是,在集合中,可以随意存储任何想干或者不想干的数据,并不像关系型数据库中已经定死了这个列必须是什么值,必须按照这个格式,如果现在不理解,待会看下面。
> db.createCollection("user",{size:20,capped:true,autolndexld:true,max:50}) { "ok" : 1 }在当前库下创建了一个集合,该集合自动添加索引,并且该集合为固定长度,20字节,集合中最多包包含50个文档。
db.createCollection(name,option),其中option是一个json格式,可选参数以及信息如下。
14、 一些集合级别的其它操作
> db.getCollectionNames()[ "system.indexes", "user" ]
> show collectionssystem.indexesuser
两个指令都是获得到当前库下的所有集合名。
> db.getCollection("user")
获得到单个的集合信息xuye.user
> db.printCollectionStats();
会显示当前库下集合的创建信息,例如MySQL的查看表设置的信息。user{
"ns" : "xuye.user", "count" : 0, "size" : 0, "storageSize" : 4096, "numExtents" : 1, "nindexes" : 1, "lastExtentSize" : 4096, "paddingFactor" : 1, "systemFlags" : 1, "userFlags" : 0, "totalIndexSize" : 8176, "indexSizes" : {
"_id_" : 8176 }, "capped" : true, "max" : 50, "ok" : 1}
> db.user.drop()
删除当前库下的user集合。true
15、 文档级别的操作指令:
> db.student.insert({
"name":"xuye","school":"hafo","numbe":141420014})
插入一条文档,我并没有创建集合student,直接写插入语句,如果表不存在会自动创建(一般都是使用此方式来建表,而不是去用createColletion()创建表,此方式的容量会自动增长。)
> db.student.insert({
"class":101,"number":1401420,"teach":"xuye"})
在插入一条文档,可以发现,两条文档之间的格式要求是没有任何关系的,甚至你可以随便插入不是关于学生此类的信息都可以,但是一般一个表只插入一类信息的文档(约定成俗的)。
> db.student.find()
查看该集合中所有的文档。{
"_id" : ObjectId("5b7d1aa979c725e3580ed2db") }{
"_id" : ObjectId("5b7d1b1d79c725e3580ed2dc"), "name" : "xuye", "school" : "hafo", "numbe" : 141420014 }{
"_id" : ObjectId("5b7d1c57c8ff91d6ecaf79d8"), "class" : 101, "number" : 1401420, "teach" : "xuye" }
此处还需要注意,我们并没有插入_id这个东西,这是mongodb自动帮我们生成的一个id,是唯一的,所以也就不需要我们去生成id了。
> db.student.find().pretty(){
"_id" : ObjectId("5b7d1aa979c725e3580ed2db") }{
"_id" : ObjectId("5b7d1b1d79c725e3580ed2dc"), "name" : "xuye", "school" : "hafo", "numbe" : 141420014}
格式化显示查询的语句,应该还有几条,我只取了其中一条粘贴在这里,就类似代码的格式化,好看一些。
> db.student.insert({
"name":"xuye","number":140246,"deskmate":{
"name":"xiaobai","number":140265}})
插入一条复杂一些的文档,可以嵌套,和json一样,只要符合键值对的形式都可以使用。如果多个嵌套的话,要使用中括号,如下。
db.student.insert({
"name":"xuye","number":140246,"deskmate":[{
"name":"xiaobai","number":140265},{
"name":"xiaohei","