前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >听说MongoDB你很豪横?-------------MongoDB数据库基础详解

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

作者头像
不吃小白菜
发布2020-09-15 09:53:23
1K0
发布2020-09-15 09:53:23
举报

文章目录

  • 一、 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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、 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
                                              腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
                                              领券
                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档