重要知识点:
MongoDB 是一个是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB有2种安装方式:离线安装和在线安装。在线安装一般会比较慢,所以本实验采取离线安装方式。实验内容与步骤: 一、mongoDB的安装与配置
MongoDB下载 官网:https://www.mongodb.com/ 下载,建议下载稳定版本mongodb-linux-x86_64-ubuntu1604-4.0.1 如果你是其他版本的Ubuntu,需要下载对应版本的安装包。下载完成后,会自动下载到Downloads目录下:
MongoDB安装 1)解压安装包mongodb-linux-x86_64-ubuntu1604-4.0.1至路径 /opt。 终端命令:sudo tar -zxvf mongodb-linux-x86_64-ubuntu1604-4.0.1.tgz -C /opt/2)查看是否解压成功
3)将解压的文件夹重命名为mongodb并添加mongodb权限 文件夹重命名为mongodb 终端命令:sudo mv mongodb-linux-x86_64-ubuntu1604-4.0.1 mongodb 更改mongodb文件夹的属主。hadoop是用户名 终端命令:sudo chown -R hadoop mongodb
4)创建数据和日志目录并授权 终端命令:sudo mkdir -pv mongodb/data/{mongodb_data,mongodb_log} 其中,mongodb_data是数据目录,mongodb_log是日志目录 终端命令:sudo chown -R hadoop data/
5)在/mongodb/data/mongodb_log目录下新建mongodb.log文件
终端命令:sudo vi mongodb/data/mongodb_log/mongodb.log
按Esc 输入wq! 保存退出
6)创建并配置文件mongodb/data/mongo_data/mongodb.conf 终端命令:sudo vi mongodb/data/mongodb_data/mongodb.conf
按 i 进入输入模式,复制日志内容,按ESC 输入 wq! 保存退出
在mongodb.conf中写入如下配置信息(可以直接拷贝,要注意中文格式的影响): 注意检查是否复制成功,用vim复制时有时会出现首行有几个字母丢失的问题。
#日志文件位置 logpath=/opt/mongodb/data/mongodb_log/mongodb.log # 以追加方式写入日志 logappend=true # 是否以守护进程方式运行 fork=true # 默认27017 port = 27017 # 数据库文件位置 dbpath=/opt/mongodb/data/mongodb_data/ # 启用定期记录CPU利用率和 I/O 等待 #cpu = true # 是否以安全认证方式运行,默认是不认证的非安全方式 #noauth = true #auth = true # 详细记录输出 #verbose = true # Inspect all client data for validity on receipt (useful for # developing drivers)用于开发驱动程序时验证客户端请求 #objcheck = true # Enable db quota management # 启用数据库配额管理 #quota = true # 设置oplog记录等级 # Set oplogging level where n is # 0=off (default) # 1=W # 2=R # 3=both # 7=W+some reads #diaglog=0 # Diagnostic/debugging option 动态调试项 #nocursors = true # Ignore query hints 忽略查询提示 #nohints = true # 禁用http界面,默认为localhost:28017 #nohttpinterface = true # 关闭服务器端脚本,这将极大的限制功能 # Turns off server-side scripting. This will result in greatly limited # functionality #noscripting = true # 关闭扫描表,任何查询将会是扫描失败 # Turns off table scans. Any query that would do a table scan fails. #notablescan = true # 关闭数据文件预分配 # Disable data file preallocation. #noprealloc = true # 为新数据库指定.ns文件的大小,单位:MB # Specify .ns file size for new databases. # nssize = # Replication Options 复制选项 # in replicated mongo databases, specify the replica set name here #replSet=setname # maximum size in megabytes for replication operation log #oplogSize=1024 # path to a key file storing authentication info for connections # between replica set members #指定存储身份验证信息的密钥文件的路径 #keyFile=/path/to/keyfile7)脚本方式启动mongodb服务
cd /opt/mongodb ./bin/mongod -f data/mongodb_data/mongodb.conf 成功启动服务截图如下:
如果启动时,遇到了以上错误 先运行以下命令: sudo apt-get update sudo apt-get -f install sudo apt-get install libcurl4-openssl-dev sudo apt-get install curl 安装 curl即可/
输入pgrep mongo -l可以查看是否启动成功,截图如下:
8)进入mongodb shell模式 终端命令: cd /opt/mongodb ./bin/mongo
9)退出mongodb shell模式 输入exit或Ctrl+C退出shell模式
10)关闭mongodb服务 终端命令: use admin db.shutdownServer()
二、shell命令模式使用MongoDB
首先进入mongodb shell模式 cd /opt/mongodb ./bin/mongo
常用操作命令: 数据库相关:
show dbs:显示数据库列表show collections:显示当前数据库中的集合(类似关系数据库中的表table)show users:显示所有用户use yourDB:切换当前数据库至yourDBdb.help() :显示数据库操作命令db.yourCollection.help() :显示集合操作命令,yourCollection是集合名MongoDB没有创建数据库的命令,如果你想创建一个“School”的数据库,先运行use School命令,之后做一些操作(如:创建聚集集合db.createCollection(‘teacher’)),这样就可以创建一个名叫“School”的数据库。截图如下: 下面以一个School数据库为例,在School数据库中创建两个集合teacher和student,并对student集合中的数据进行增删改查基本操作(集合Collection相当于关系型数据库中的表table)。 切换到School数据库use School #切换到School数据库。MongoDB 无需预创建School数据库,在使用时会自动创建 2) 创建Collection
db.createCollection(‘teacher’) #创建一个聚集集合。MongoDB 其实在插入数据的时候,也会自动创建对应的集合,无需预定义集合
插入数据 与数据库创建类似,插入数据时也会自动创建集合。 插入数据有两种方式:insert和save。db.student.insert({_id:1, sname: ‘zhangsan’, sage: 20}) #_id可选 db.student.save({_id:1, sname: ‘zhangsan’, sage: 22}) #_id可选
这两种方式,其插入的数据中_id字段均可不写,会自动生成一个唯一的_id来标识本条数据。而insert和save不同之处在于:在手动插入_id字段时,如果_id已经存在,insert不做操作,save做更新操作;如果不加_id字段,两者作用相同都是插入数据。截图如下:
添加的数据其结构是松散的,只要是bson格式均可,列属性均不固定,根据添加的数据为准。先定义数据再插入,就可以一次性插入多条数据,截图如下:
运行完以上例子,student 已自动创建,这也说明 MongoDB 不需要预先定义 collection ,在第一次插入数据后,collection 会自动的创建。截图如下:
查找数据 db.youCollection.find(criteria, filterDisplay) criteria :查询条件,可选 filterDisplay:筛选显示部分数据,如显示指定列数据,可选(当选择时,第一个参数不可省略,若查询条件为空,可用{}做占位符,如下例第三句)db.student.find() #查询所有记录。相当于:select * from student db.student.find({sname: ‘lisi’}) #查询sname='lisi’的记录。相当于: select * from student where sname=‘lisi’ db.student.find({},{sname:1, sage:1}) #查询指定列sname、sage数据。相当于:select sname,sage from student。sname:1表示返回sname列,默认_id字段也是返回的,可以添加_id:0(意为不返回_id)写成{sname: 1, sage: 1,_id:0},就不会返回默认的_id字段了 db.student.find({sname: ‘zhangsan’, sage: 22}) #and 与条件查询。相当于:select * from student where sname = ‘zhangsan’ and sage = 22 db.student.find({$or: [{sage: 22}, {sage: 25}]}) #or 条件查询。相当于:select * from student where sage = 22 or sage = 25
查询操作类似,这里只给出db.student.find({sname: ‘lisi’})查询的截图,如下:
db.youCollection.find(criteria, filterDisplay).pretty()表示格式化输出,截图如下:
修改数据 db.youCollection.update(criteria, objNew, upsert, multi ) criteria: update的查询条件,类似sql update查询内where后面的 objNew : update的对象和一些更新的操作符(如KaTeX parse error: Expected '}', got 'EOF' at end of input: …ame: 'lisi'}, {set: {sage: 30}}, false, true) #相当于:update student set sage =30 where sname = ‘lisi’; 删除数据db.student.remove({sname: ‘zhaoliu’}) #相当于:delete from student where sname=‘zhaoliu’
操作截图如下:
删除集合db.student.drop() 操作截图如下:
退出shell命令模式 输入exit或者Ctrl+C退出shell命令模式到了这一步,本次实验就完成了,你今天学会了吗?