Mongodb数据库基础(3.6.19版本)

一、Mongodb概述

1.1简介

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

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

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

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

1.2特点

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

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

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

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

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

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

1.3适用场景

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

1.4redis和mongodb对比

Redis是完全在内存中保存数据的数据库,使用磁盘只是为了持久性目的,Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据,持久化是使用RDB方式或者aof方式。

mongodb是文档型的非关系型数据库,MongoDB更类似MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务。

mongodb的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。
然后,mongodb就在这块区域里面进行数据修改,避免了零碎的硬盘操作。
至于mmap上的内容flush到硬盘就是操作系统的事情了,所以,如果,mongodb在内存中修改了数据后,mmap数据flush到硬盘之前,系统宕机了,数据就会丢失。

二、安装mongodb

1.配置官方yum源安装mongodb

[root@localhost yum.repos.d]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim mongodb-org.repo
[mongodb]
name=mongodb
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
[root@localhost yum.repos.d]# yum list
[root@localhost yum.repos.d]# yum -y install mongodb-org

2.修改配置文件监听地址

[root@localhost ~]# vim /etc/mongod.conf
...省略内容
net: 
  port: 27017       #监听端口
  bindIp: 0.0.0.0  #监听地址,原来是127.0.0.1,只能本地访问,换成0.0.0.0,任意都能访问

3.启动服务mongod.service

[root@localhost ~]# systemctl start mongod.service
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# mongo   #输入mongo就进入数据库了
...省略内容
> show dbs    #查看有哪几个库
admin   0.000GB
config  0.000GB
local   0.000GB

三、如何配置多实例

1.拷贝配置文件以创建新实例

[root@localhost ~]# cd /etc/
[root@localhost etc]# cp -p mongod.conf mongod2.conf
[root@localhost etc]# vim mongod2.conf
...省略内容
path: /data/mongodb/mongod2.log
dbPath: /data/mongodb/mongo
port: 27018
[root@localhost etc]# mkdir -p /data/mongodb
[root@localhost etc]# cd /data/mongodb/
[root@localhost mongodb]# touch mongod2.log
[root@localhost mongodb]# mkdir mongo

2.加载刚才新建的实例

[root@localhost mongodb]# mongod -f /etc/mongod2.conf   
about to fork child process, waiting until server is ready for connections.
forked process: 14751
child process started successfully, parent exiting
[root@localhost mongodb]# mongo --port 27018     #登录监听端口为27018的数据库
> db.version()    #可以查看版本
3.6.19

四、基本操作

4.1增删改查操作实例

> use school      #mongodb中无需创建,直接使用(在里面创建了集合show dbs才能看到)
switched to db school
> db.createCollection('info')   #在school库中创建集合info
{
    
     "ok" : 1 }
> db.info.insert({
    
    "id":1,"name":"zhangsan","score":78,"hobby":["game","sport"]})  #在集合中插入数据
WriteResult({
    
     "nInserted" : 1 })
> db.info.find()        #查看info集合中的所有内容
{
    
     "_id" : ObjectId("5f56e212cd5781b1ba9d5426"), "id" : 1, "name" : "zhangsan", "score" : 78, "hobby" : [ "game", "sport" ] }
> a=db.info.find()    #创建a是db.info.find() 的别名
{
    
     "_id" : ObjectId("5f56e212cd5781b1ba9d5426"), "id" : 1, "name" : "zhangsan", "score" : 78, "hobby" : [ "game", "sport" ] }

> for(var i=2;i<=100;i++)db.info.insert({
    
    "id":i,"name":"jack"+i})  #利用循环一次性创建多个数据
WriteResult({
    
     "nInserted" : 1 })
> db.info.find()
{
    
     "_id" : ObjectId("5f56e212cd5781b1ba9d5426"), "id" : 1, "name" : "zhangsan", "score" : 78, "hobby" : [ "game", "sport" ] }
{
    
     "_id" : ObjectId("5f56e319cd5781b1ba9d5427"), "id" : 2, "name" : "jack2" }
{
    
     "_id" : ObjectId("5f56e319cd5781b1ba9d5428"), "id" : 3, "name" : "jack3" }
{
    
     "_id" : ObjectId("5f56e319cd5781b1ba9d5429"), "id" : 4, "name" : "jack4" }
...省略内容
Type "it" for more

> db.info.findOne({
    
    "id":3})     #利用关键字查找单条记录
{
    
     "_id" : ObjectId("5f56e319cd5781b1ba9d5428"), "id" : 3, "name" : "jack3" }
> a=db.info.findOne({
    
    "id":2})
{
    
     "_id" : ObjectId("5f56e319cd5781b1ba9d5427"), "id" : 2, "name" : "jack2" }
> typeof(a.id)
number
> typeof(a.name)     #查看某个字段的类型
string
> db.info.update({
    
    "id":10},{
    
    $set:{
    
    "name":"tom"}})   #对id=10的记录进行修改
WriteResult({
    
     "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> a=db.info.findOne({
    
    "id":10})
{
    
     "_id" : ObjectId("5f56e319cd5781b1ba9d542f"), "id" : 10, "name" : "tom" }
> db.createCollection('test')
{
    
     "ok" : 1 }
> show collections
info
test
> db.test.drop()       #删除集合
true
> show collections   #查看集合;等于show tables
info
> use myscool
switched to db myscool
> db.createCollection('test')
{
    
     "ok" : 1 }
> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
myscool  0.000GB
school   0.000GB
> db.dropDatabase()     #删除库myschool,要先use myschool
{
    
     "dropped" : "myscool", "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
school  0.000GB

4.2在同一实例中复制数据库

> db.copyDatabase("school","share")   #拷贝school库,新建库名为share
{
    
     "ok" : 1 }

4.3进程管理

> db.currentOp()
...省略内容
 "opid" : 880,     #找到进程号
> db.killOp(880)

五、导出、导入操作

导出操作:
[root@localhost mongodb]# mongoexport -d school -c info -o /opt/school.json
2020-09-08T10:10:38.155+0800    connected to: localhost
2020-09-08T10:10:38.156+0800    exported 100 records
-d:指定数据库
-c:指定数据库中的集合
文件名要以.json结尾

导入操作:
[root@localhost mongodb]# mongoimport -d school -c test --file /opt/school.json 
2020-09-08T10:11:56.382+0800    connected to: localhost
2020-09-08T10:11:56.388+0800    imported 100 documents

仅导出某一行:
[root@localhost mongodb]# mongoexport -d school -c info -q '{"id":{"$eq":10}}' -o /opt/test.json
注释:
-d:指定数据库
-c:指定集合

六、如何备份与恢复数据库

#备份库school

[root@localhost mongodb]# mongodump -d school -o /backup/     
2020-09-08T10:16:47.324+0800    writing school.info to
2020-09-08T10:16:47.324+0800    writing school.test to
2020-09-08T10:16:47.325+0800    done dumping school.test (100 documents)
2020-09-08T10:16:47.325+0800    done dumping school.info (100 documents)
[root@localhost mongodb]# cd /backup/
[root@localhost backup]# ls
school
[root@localhost backup]# cd school/
[root@localhost school]# ls
info.bson  info.metadata.json  test.bson  test.metadata.json

#恢复库到abc库(如果库不存在直接新建)

[root@localhost school]# mongorestore -d abc --dir /backup/school/   

七、如何进行实例间克隆集合操作

创建完27018端口的实例后进行克隆集合操作
27018端口的实例克隆2701端口的实例school库中的info集合

[root@localhost etc]# mongo --port 27018
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> db.runCommand({
    
    "cloneCollection":"school.info","from":"14.0.0.10: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

猜你喜欢

转载自blog.csdn.net/chengu04/article/details/108543322