Mongodb 4.0 mongodb数据库基础

一、概述

1、mongodb简介

MongoDB是一款跨平台、面向文档的数据库。可以实现高性能、高可用性,并且能够轻松扩展,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多的节点可以保证服务器的性能。

在大数据时代中,大数据量的处理已经成了考量一个数据库最重要的原因之一。MongoDB的一个主要目标就是尽可能的让数据库保持卓越的性能,这很大程度地决定了MongoDB的设计。MongoDB选择了最大程度而利用内存资源用作缓存来换取卓越的性能,并且会自动选择速度最快的索引来进行查询。MongoDB尽可能精简数据库,将尽可能多的操作交给客户端,这种方式也是MongoDB能够保持卓越性能的原因之一。

MongoDB是非关系性数据库(NoSQL)中功能最丰富,最像关系数据库的。不采用关系模型是为了获取更好的扩展性,MongoDB不在有“行”的概念,其运行方式主要基于两个概念:集合(collection)和文档(document)。

2、MongoDB的特点

Mongo是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。

1、面向集合的存储:适合存储对象及JSON形式的数据。

2、MongoDB安装简单,提供了面向文档的存储功能,操作起来比较容易。

3、MongoDB提供了复制,高可用性和自动分片功能。如果负载增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上,这就是所谓的分片。

4、MongoDB支持丰富的查询表达式。

5、高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。

3、MongoDB适用场景

MongoDB可以为Web应用提供可扩展的高性能数据存储解决方案。MongoDB主要适用领域有网站数据、分布式场景、数据缓存和JSON文档格式存储。适合大数据量、高并发、弱事务的互联网应用,其内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力,可以很好的满足Web2.0和移动互联网应用数据存储的要求。

二、安装mongodb 4.0

配置本地yum源

[root@mongodb yum.repos.d]# vim /etc/yum.repos.d/mongodb-org-4.0.repo

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=0
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

yum安装

[root@mongodb yum.repos.d]# yum -y install mongodb-org

[root@mongodb yum.repos.d]# whereis mongod   <-----查看mongodb的配置文件位置
mongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1

修改配置文件

[root@mongodb yum.repos.d]# vim /etc/mongod.conf

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log    <----日志文件位置
storage:
  dbPath: /var/lib/mongo   <---数据文件存放位置
  journal:
    enabled: true   <-----设置为true,启用操作日志,以确保写入持久性和数据的一致性,会在dbpath目录下创建journal目录。
processManagement:
  fork: true  # fork and run in background    //是否后台运行,设置为true启动 进程在后台运行的守护进程模式
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo
net:
  port: 27017
  bindIp: 0.0.0.0  //允许远程访问,或者直接注释,127.0.0.1是只允许本地访问,可以用一个逗号分隔的列表绑定多个IP地址

1、启动mongodb

启动mongodb

[root@mongodb yum.repos.d]# systemctl start mongod

[root@mongodb yum.repos.d]# netstat -anpt | grep 27017
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      20265/mongod 

直接mongo进入mongo shell:

[root@mongodb ~]# mongo
MongoDB shell version v4.0.20
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session {
    
     "id" : UUID("760a7212-96f3-4d9b-b426-94b331ad2b10") }
MongoDB server version: 4.0.20
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
Server has startup warnings: 
……省略部分内容

> show dbs    <-----查看数据库
admin   0.000GB
config  0.000GB
local   0.000GB
> exit   <-----退出,或者按ctrl+c退出
bye
[root@mongodb ~]# 

2、关闭mongodb

[root@mongodb ~]# systemctl stop mongod   <----停止服务
> db.shutdownServer();
[root@mongodb ~]# mongod  --shutdown  --dbpath /data/mongodb/mongo

备注:mongod 命令的 shutdown 选项能干净的关闭 MongoDB 服务。
如果以前台方式启动 MongoDB 服务,使用“Crtl+C” 服务会关闭,这种关闭方式会等待当前进行中的的操作完成,所以依然是干净的关闭方式。

三、多实例

拷贝默认的配置文件,命名为mongod2.conf,并修改配置文件,日志文件和数据文件还有端口都要修改

[root@mongodb etc]# cp -p mongod.conf mongod2.conf 

[root@mongodb etc]# vim mongod2.conf 
systemLog:
  path: /data/mongodb/mongod2.log
storage:
  dbPath: /data/mongodb/mongo2
net:
  port: 27018

[root@mongodb etc]# 
[root@mongodb etc]# mkdir -p /data/mongodb   <----创建指定目录
[root@mongodb etc]# cd /data/mongodb/
[root@mongodb mongodb]# mkdir mongo
[root@mongodb mongodb]# ls
mongo
[root@mongodb mongodb]# touch mongod2.log
[root@mongodb mongodb]# chmod 777 mongod2.log  <----要给日志文件最大权限
[root@mongodb mongodb]# ls
mongo  mongod2.log
[root@mongodb mongodb]# which mongod
/usr/bin/mongod
[root@mongodb mongodb]# mongod -f /etc/mongod2.conf <---指定配置文件启动
about to fork child process, waiting until server is ready for connections.
forked process: 20510
child process started successfully, parent exiting

启动之后用如下命令进入第二个实例

[root@mongodb mongodb]# mongo --port 27018    <-----需要指定连接端口

四、数据库基本操作

查看数据库版本

> db.version() 
4.0.20
> use school;   //不用创建数据库,直接使用
switched to db school

查看当前数据库

> db 
school

查看数据库

> show dbs;   //里面没有表的话是查询不到该数据库的
admin   0.000GB
config  0.000GB
local   0.000GB

新建info集合(表)

> db.createCollection('info')   //新建info表,如果不手动创建集合;向不存在的集合中第一次加入数据的时候,集合会被自动创建出来
{
    
     "ok" : 1 }
> show dbs;   //再次查询数据库就有school数据库了
admin   0.000GB
config  0.000GB
local   0.000GB
school  0.000GB

查看表的两种方式

> show collections   //查看表
info
> show tables;   //查看表
info

查看info表的数据

> db.info.find()   //因为表里还没有数据所以查询不到

插入一条数据

> db.info.insert({
    
    "id":1,"name":"zhangsan","score":90,"hobby":["game","music","sport"]})
WriteResult({
    
     "nInserted" : 1 }) 

查看info表的数据

> db.info.find()
{
    
     "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "zhangsan", "score" : 90, "hobby" : [ "game", "music", "sport" ] }

定义别名

> a=db.info.find()  //给这条命令定义一个别名a
{
    
     "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "zhangsan", "score" : 90, "hobby" : [ "game", "music", "sport" ] }

查看id=1的记录详情

> db.info.findOne({
    
    "id":1})   
{
    
    
	"_id" : ObjectId("5f56eafbbb50f14e91ed31e0"),
	"id" : 1,
	"name" : "zhangsan",
	"score" : 90,
	"hobby" : [
		"game",
		"music",
		"sport"
	]
}

查看数据类型

> typeof(a.id)   
number
> typeof(a.name)
string
> typeof(a.score)
number
> typeof(a.hobby)
object

修改id=1的记录的name为tom

> db.info.update({
    
    "id":1},{
    
    $set:{
    
    "name":"tom"}})  
WriteResult({
    
     "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> a=db.info.find()
{
    
     "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "tom", "score" : 90, "hobby" : [ "game", "music", "sport" ] }

删除表

> db.createCollection('test')  //创建test表
{
    
     "ok" : 1 }

> show tables;
info
test

> db.test.drop()  //删除test表
true
> show tables;
info

删除数据库

> use myschool   //新建myschool数据库
switched to db myschool
> db.createCollection('a')
{
    
     "ok" : 1 }
> show dbs
admin     0.000GB
config    0.000GB
local     0.000GB
myschool  0.000GB
school    0.000GB
> db.dropDatabase()      //删除数据库,需要先use
{
    
     "dropped" : "myschool", "ok" : 1 }
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB
school  0.000GB

查看info表有多少条记录

> use school
switched to db school
> show tables
info
> db.info.count()   
1

把info表的记录添加到100条(需要用到for循环)

> for(var i=2;i<=100;i++)db.info.insert({
    
    "id":i,"name":"jack"+i}})
WriteResult({
    
     "nInserted" : 1 })
//这里在for循环中直接声明一个变量var
> db.info.find()
{
    
     "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "tom", "score" : 90, "hobby" : [ "game", "music", "sport" ] }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c4"), "id" : 2, "name" : "jack2" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c5"), "id" : 3, "name" : "jack3" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c6"), "id" : 4, "name" : "jack4" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c7"), "id" : 5, "name" : "jack5" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c8"), "id" : 6, "name" : "jack6" }
……
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d6"), "id" : 20, "name" : "jack20" }
Type "it" for more
//只显示20条记录,多余的需要按it继续显示
> it
……省略部分内容
{
    
     "_id" : ObjectId("5f570266a1451cb5e4206126"), "id" : 100, "name" : "jack100" }

五、导入导出

-d:指定数据库
-c:指定表
-o:指定导出文件
–file:指定从哪个文件导入

导出school库的info表:

[root@mongodb ~]# mongoexport -d school -c info -o /opt/school.json
2020-09-08T11:56:53.466+0800	connected to: localhost
2020-09-08T11:56:53.467+0800	exported 1 record

查看导出文件:

[root@mongodb ~]# vim /opt/school.json

{
    
    "_id":{
    
    "$oid":"5f56eafbbb50f14e91ed31e0"},"id":1.0,"name":"tom","score":90.0,"hobby":["game","music","sport"]}

导入:(导入一个新表info2,如果表不存在,会新建这个表)

[root@mongodb ~]# mongoimport -d school -c info2 --file /opt/school.json
2020-09-08T11:58:46.720+0800	connected to: localhost
2020-09-08T11:58:46.732+0800	imported 1 document

进入数据库验证

[root@mongodb ~]# mongo

> use school
switched to db school
> show tables
info
info2
> db.info2.find()
{
    
     "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "tom", "score" : 90, "hobby" : [ "game", "music", "sport" ] }

基于条件的导出:(导出info表里id=10的记录)

[root@mongodb ~]# mongoexport -d school -c info -q '{"id":{"$eq":10}}' -o /opt/top10.json
2020-09-08T12:12:26.122+0800	connected to: localhost
2020-09-08T12:12:26.123+0800	exported 1 record

查询条件操作符:
(=) 等于 - $eq
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte

查看导出文件:

[root@mongodb ~]# vim /opt/top10.json 

{
    
    "_id":{
    
    "$oid":"5f570266a1451cb5e42060cc"},"id":10.0,"name":"jack10"}

六、备份恢复

备份命令mongodump
恢复命令mongorestore

需要在shell命令行操作

[root@mongodb ~]# mkdir /bak   //新建备份目录
[root@mongodb ~]# mongodump -d school -o /bak   //备份到/bak目录
2020-09-08T12:15:12.357+0800	writing school.info to 
2020-09-08T12:15:12.357+0800	writing school.info2 to 
2020-09-08T12:15:12.359+0800	done dumping school.info2 (1 document)
2020-09-08T12:15:12.359+0800	done dumping school.info (100 documents)
[root@mongodb ~]# ls /bak/
school
[root@mongodb ~]# cd /bak/school
[root@mongodb school]# ls
info2.bson  info2.metadata.json  info.bson  info.metadata.json

从备份目录恢复数据库,数据库不存在的话会自动创建

[root@mongodb school]# mongorestore -d school2 --dir=/bak/school
2020-09-08T12:17:39.469+0800	the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2020-09-08T12:17:39.470+0800	building a list of collections to restore from /bak/school dir
2020-09-08T12:17:39.470+0800	reading metadata for school2.info2 from /bak/school/info2.metadata.json
2020-09-08T12:17:39.471+0800	reading metadata for school2.info from /bak/school/info.metadata.json
2020-09-08T12:17:39.477+0800	restoring school2.info2 from /bak/school/info2.bson
2020-09-08T12:17:39.483+0800	restoring school2.info from /bak/school/info.bson
2020-09-08T12:17:39.484+0800	no indexes to restore
2020-09-08T12:17:39.484+0800	finished restoring school2.info2 (1 document)
2020-09-08T12:17:39.487+0800	no indexes to restore
2020-09-08T12:17:39.487+0800	finished restoring school2.info (100 documents)
2020-09-08T12:17:39.487+0800	done
[root@mongodb school]# 
//还原指定数据库,这个数据库可以是一个新的,不存在的,它会自己创建

进入数据库验证

> show dbs;
admin    0.000GB
config   0.000GB
local    0.000GB
school   0.000GB
school2  0.000GB
> use school2
switched to db school2
> show tables
info
info2

七、克隆

1、克隆数据库

> db.copyDatabase("school","share")   //复制数据库,新库叫share
WARNING: db.copyDatabase is deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation
{
    
    
	"note" : "Support for the copydb command has been deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation",
	"ok" : 1
}
> show dbs;
admin    0.000GB
config   0.000GB
local    0.000GB
school   0.000GB
school2  0.000GB
share    0.000GB

db.copyDatabase在4.0以后已经被弃用,但是依然可以成功

2、克隆集合(表)

要先创建多实例
为多实例创建数据目录

[root@mongodb school]# cd /data/mongodb/
[root@mongodb mongodb]# touch mongod{
    
    3,4}.log
[root@mongodb mongodb]# chmod 777 mongod*.log
[root@mongodb mongodb]# mkdir mongo{
    
    2,3,4}

修改配置文件(省略,上面已经介绍过)
启动实例3和实例4

[root@mongodb etc]# mongod -f /etc/mongod3.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 81392
child process started successfully, parent exiting

[root@mongodb etc]# mongod -f /etc/mongod4.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 81422
child process started successfully, parent exiting

查看监听端口,可以看到启动了4个mongodb实例

[root@mongodb etc]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      20265/mongod        
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      20510/mongod        
tcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      81392/mongod        
tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      81422/mongod   
 

克隆表需要进入实例,进入数据库,执行克隆的操作db.runCommand

[root@mongodb ~]# mongo --port 27018
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB

> db.runCommand({
    
    "cloneCollection":"school.info","from":"192.168.245.207:27017"})
{
    
     "ok" : 1 }
> 
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB
school  0.000GB
> use school
switched to db school
> show tables
info
> db.info.find()
{
    
     "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "tom", "score" : 90, "hobby" : [ "game", "music", "sport" ] }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c4"), "id" : 2, "name" : "jack2" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c5"), "id" : 3, "name" : "jack3" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c6"), "id" : 4, "name" : "jack4" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c7"), "id" : 5, "name" : "jack5" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c8"), "id" : 6, "name" : "jack6" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060c9"), "id" : 7, "name" : "jack7" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060ca"), "id" : 8, "name" : "jack8" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060cb"), "id" : 9, "name" : "jack9" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060cc"), "id" : 10, "name" : "jack10" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060cd"), "id" : 11, "name" : "jack11" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060ce"), "id" : 12, "name" : "jack12" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060cf"), "id" : 13, "name" : "jack13" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d0"), "id" : 14, "name" : "jack14" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d1"), "id" : 15, "name" : "jack15" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d2"), "id" : 16, "name" : "jack16" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d3"), "id" : 17, "name" : "jack17" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d4"), "id" : 18, "name" : "jack18" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d5"), "id" : 19, "name" : "jack19" }
{
    
     "_id" : ObjectId("5f570266a1451cb5e42060d6"), "id" : 20, "name" : "jack20" }
Type "it" for more
> 

猜你喜欢

转载自blog.csdn.net/shengjie87/article/details/108481601