听说MongoDB你很豪横?-------------MongoDB数据库基础详解

2020-09-15 09:53:23 浏览数 (1)

文章目录

  • 一、 MongoDB相关概念
    • 1、业务应用场景
    • 2、MongoDB可应对“三高"需求。
    • 3、什么时候选择MongoDB ?
  • 二、MongoDB简介
    • 1、体系结构
    • 2、数据模型
  • 三、MongoDB的特点
  • 四、安装MongoDB
    • 1、配置本地yum源
    • 2、yum安装
    • 3、修改配置文件
    • 4、启动mongodb
    • 5、进入MongoDB数据库
  • 五、数据库简单的操作命令
    • 1、选择和创建数据库
    • 2、数据库的删除
    • 3、集合的隐式创建与删除
    • 4、插入数据
    • 5、更改数据
  • 六、导入导出
    • 1、导出school库的info表:
    • 2、查看导出文件:
    • 3、导入:(导入一个新表info2,如果表不存在,会新建这个表)
    • 4、进入数据库验证
    • 5、基于条件的导出:(导出info表里id=10的记录)
  • 七、备份恢复
  • 八、克隆
    • 1、克隆数据库
    • 2、克隆集合(表)

一、 MongoDB相关概念

1、业务应用场景

传统的关系型数据库(如MySQL) ,在数据操作的"三高需求以及应对Web2.0的网站需求面前,显得力不从心。 解释:“三高”需求: ●High performance -对数据库并发读写的需求。 ●Huge Storage -对海量数据的高效率存储和访问的需求。 ●High Scalability & High Availability-对数据库的高可扩展性和高可用性的需求。

2、MongoDB可应对“三高"需求。

具体的应用场景如:

  • 1)社交场景,使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索实现附近的 人地点等功能。
  • 2)游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、 高敲率存储和访问。
  • 3)物流场景,使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式 来存储,- -次查询就能将订单所有的变更读取出来。
  • 4)物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多 维度的分析。
  • 5)视频直播,使用MongoDB存储用户信息、点赞互动信息等。

这些应用场景中,数据操作方面的共同特点是:

  • (1)数据量大
  • (2)写入操作频繁(读写都很频繁)
  • (3)价值较低的数据,对事务性要求不高 对于这样的数据,我们更适合使用MongoDB来实现数据的存储。

3、什么时候选择MongoDB ?

在架构选型上,除了上述的三个特点外,如果你还犹豫是否要选择它?可以考虑以下的一些问题: 应用不需要事务及复杂join支持 新应用,需求会变,数据模型无法确定,想快速迭代开发 应用需要2000-3000以上的读写QPS (更高也可以) 应用需要TB甚至PB级别数据存储 应用发展迅速,需要能快速水平扩展 应用要求存储的数据不失 应用需要99.999%高可用 应用需要大量的地理位置查询、文本查询 如果上述有1个符合,可以考虑MongoDB, 2个及以上的符合,选择MongoDB绝不会后悔。

如果用MySQL呢? 相对MySQL,可以以更低的成本解决问题(包括学习、开发、运维等成本)

二、MongoDB简介

MongoDB是一个开源、 高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数 据库产品中的一种。是最像关系型数据库(MySQL) 的非关系型数据库。 它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相 当的灵活。 MongoDB中的记录是一个文档, 它是一个由字段和值对(field:value) 组成的数据结构。MongoDB文档类似于 JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可 以包括其他文档、普通数组和文档数组。

1、体系结构

2、数据模型

MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。数据在 MongoDB中以BSON (Binary-JSON) 文档的格式存储在磁盘上。 BSON (Binary Serialized Document Format)是-种类json的一 种二进制形式的存储格式,简称Binary JSON。 BSON和JSON-样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一-些数据类型,如Date和 BinData类型。

三、MongoDB的特点

MongoDB主要有如下特点:

  • (1)高性能: MongoDB提供高性能的数据持久性。特别是, 对嵌入式数据模型的支持减少了数据库系统上的I/0活动。 弓支持更快的查询,并且可以包含来自嵌入式文档和数组的键。(文本索引解决搜索的需求、 TTL索引解决历史数据自动过期的需求、地理位置索弓可用于构建各种020应用) mmapv1、wiredtiger、 mongorocks (rocksdb) 、in-memory 等多引擎支持满足各种场景需求。 Gridfs解决文件存储的需求。
  • (2)高可用性: . MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余。
  • (3)高扩展性: MongoDB提供了水平可扩展性作为其核心功能的一部分。 分片将数据分布在一组集群的机器上。(海量数据存储, 服务能力水平扩展) 从3.4开始,MongoDB支持基于片 键创建数据区域。在一个平衡的集群中, MongoDB将-个区域所覆盖的读写只 定向到该区域内的那些片。
  • (4)丰富的查询支持: MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等。
  • (5) 其他特点:如无模式(动态模式)、 灵活的文档模型、

四、安装MongoDB

1、配置本地yum源

代码语言:javascript复制
[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

2、yum安装

代码语言:javascript复制
yum list
[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

3、修改配置文件

代码语言:javascript复制
systemlog:
MongoDB发送所有日志输出的目标指定为文件
# #The path of the 1og file to which mongod or mongos should send a11 di agnostic logging
i nformation
destination: file ⊥
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/sing1e/1og/mongod. log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
stor age:
#mongod实例存储其数据的目录。stor age . dbPath设置仅适用于mongod。
##The directory where the mongod instance stores its data.Default value is " /data/db".
dbPath: " /mongodb/sing1e/data/db"
journa1:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。当数据库发生宕机后,将数据库的状态恢复到之前
enabled: true
proces sManagement :
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
net:
#服务实例绑定的IP,默认是localhost
bindIp: localhost ,0.0.0.0  '监听所有端口'
#bindIp
#绑定的端口,默认是27017
port: 27017

4、启动mongodb

代码语言:javascript复制
[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 

5、进入MongoDB数据库

代码语言:javascript复制
[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 ~]# 

五、数据库简单的操作命令

数据库名可以是满足以下条件的任意UTF-8字符串。

  • 不能是空字符串(")。 .
  • 不得含有’ (空格)、、$、1、和h0 (空字符)。
  • 应全部小写。
  • 最多64字节。

MongoDBmore的三个数据库

  • admin:从权限的角度来看,这是"root’数据库。要是将一个用户添加到这个数据库, 这个用户自动继承所 有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务 器。
  • local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用, 用于保存分片的相关信息。

1、选择和创建数据库

选择和创建数据库的语法格式: . use数据库名称 如果数据库不存在则自动创建,例如,以下语句创建spitdb数据库: 如果有的话直接就进入到这个数据库中

代码语言:javascript复制
use articledb

查看有权限查看的所有的数据库命令

代码语言:javascript复制
show dbs

代码语言:javascript复制
show databases

注意:在MongoDB中,集合只有在内容插入后才会创建!就是说,创建集合(数据表)后要再插入一个文档(录),集合才会真正创建。 #查看当前正在使用的数据库命令 MongoDB中默认的数据库为test,如果你没有选择数据库,集合将存放在test数据库中。

2、数据库的删除

MongoDB删除数据库的语法格式如下:

代码语言:javascript复制
> db.dropDatabase();
{ "ok" : 1 }

提示:主要用来删除已经持久化的数据库,而内存中还是有这个库的

3、集合的隐式创建与删除

基本语法格式: .

db.createCollection(“shang”) { “ok” : 1 }

参数说明:

查看当前库中的表: show tables命令 show collections 或 show tables

当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。

提示:通常我们使用隐式创建文档即可。

集合删除语法格式如下: db. collection. drop() 或 db .集合.drop() 返回值 如果成功删除选定集合,则drop()方法返回true,否则返回false。

db.shang.drop() true

4、插入数据

要向info的集合(表)中插入一条测试数据:

db.createCollection(‘info’) //新建info表,如果不手动创建集合;向不存在的集合中第一次加入数据的时候,集合会被自动创建出来 { “ok” : 1 }

提示:

  1. info集合如果不存在,则会隐式创建
  2. mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数Numberlnt(整型数字),否则取出来就有问题了。 3)插入当前日期使用new Date() 4)插入的数据没有指定. _id,会自动生成主键值 5)如果某字段没值,可以赋值为null,或不写该字段。 执行后,如下,说明插入一个数据成功了。 Wr iteResult({ “nInserted” : 1 })

利用for循环批量添加用户

代码语言:javascript复制
> for(var i=2;i<=100;i  )db.info.insert({"id":1,"name":"jack" i})
> { "_id" : ObjectId("5f5b1f18a53aea026deda1d6"), "id" : 1, "name" : "jack2" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1d7"), "id" : 1, "name" : "jack3" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1d8"), "id" : 1, "name" : "jack4" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1d9"), "id" : 1, "name" : "jack5" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1da"), "id" : 1, "name" : "jack6" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1db"), "id" : 1, "name" : "jack7" }

查询name字段中jack10的信息

代码语言:javascript复制
> db.info.findOne({name:"jack10"})
{
	"_id" : ObjectId("5f5b3018c34c98ad91e8673c"),
	"id" : 1,
	"name" : "jack10"
}
> 

查询字段的type类型

代码语言:javascript复制
> a=db.info.findOne({name:"jack10"})
{
	"_id" : ObjectId("5f5b3018c34c98ad91e8673c"),
	"id" : 1,
	"name" : "jack10"
}
> typeof(a.id)
number
> 
> typeof(a.name)
string

这里你会发现每条文档会有一个叫_id的字段,这个相当于我们原来关系数据库中表的主键,当你在插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。 如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类 型。

5、更改数据

代码语言:javascript复制
修改id=1的记录的name为tom
> db.info.update({"id":1},{$set:{"name":"tom"}})  
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

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

六、导入导出

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

1、导出school库的info表:

代码语言:javascript复制
[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

2、查看导出文件:

代码语言:javascript复制
[root@mongodb ~]# vim /opt/school.json

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

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

代码语言:javascript复制
[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

4、进入数据库验证

代码语言:javascript复制
[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" ] }

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

代码语言:javascript复制
[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 (>) 大于 - lt (>=) 大于等于 -

查看导出文件:

代码语言:javascript复制
[root@mongodb ~]# vim /opt/top10.json 

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

七、备份恢复

备份命令mongodump 恢复命令mongorestore

需要在shell命令行操作

代码语言:javascript复制
[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
代码语言:javascript复制
从备份目录恢复数据库,数据库不存在的话会自动创建
[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]# 
//还原指定数据库,这个数据库可以是一个新的,不存在的,它会自己创建

进入数据库验证

代码语言:javascript复制
> 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在4.0以后已经被弃用,但是依然可以成功

代码语言:javascript复制
> 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

2、克隆集合(表)

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

代码语言:javascript复制
> use school
switched to db school
> show tables
info
> db.info.drop()
true
> db.runCommand({"cloneCollection":"school.info","from":"192.168.110.133:27017"})
{ "ok" : 1 }
> show tables
info

0 人点赞