golang数据库 MongoDB(1)

Golang 2023/04/23 MongoDB, Golang

一 MongoDB简介

MongoDB采用C++开发,是当前最火热的nosql数据库之一,可以在许多场合替代传统的关系型数据库。
MongoDB是一个面向集合、模式自由的文档型数据库,Mongo存储的数据是以BSON为单位(二进制化的JSON),Mongo内置了JavaScript解释器,所以可以使用类似JS的面向对象查询语法,媲美SQL。

MongoDB主要特点如下:

  • 面向集合文档存储

  • 模式自由:一个集合可以存储一个键值对的文档,也可以存储多个键值对的文档

  • 动态查询:支持查询语句使用JSON参数

  • 支持复制和恢复

  • 支持高效二进制存储,包括大型食品、图片等

MongoDB使用场景:

  • 可以替代大多数对关系性要求不高的数据存储,如私信功能

  • 自动分片,适合高伸缩的场景

  • 大数据、低价值数据的存储

Mongo的弱项:

  • 高度依赖事务的系统

  • 针对特定问题的BI数据库需要高度优化的查询方式

Mongo的版本号中3.4.2中第二个数4如果是偶数,代表稳定版,推荐使用。

32位版本的Mongo单个数据库实例最大大小为2G左右,而64位则为128T,所以推荐使用64位。

二 MongoDB安装

2.1 win安装

下载对应版本后下一步下一步即可

2.2 mac安装

解压安装文件即可,启动方式同win

2.3 linx安装

下载版本为:Linux 64-bit legacy x64

安装:
tar -zxvf mongodb-linux-x86_64-4.0.6.tgz
mv mongodb-linux-x86_64-4.0.6 /usr/local/mongodb
vim /etc/profile                    # 只想在当前账户下,可编辑用户目录下的.bashprofile
export PATH=/usr/local/mongodb/bin:$PATH

配置数据目录:
mkdir -p /root/mongo/data           # 创建数据目录
mkdir -p /root/mongo/logs           # 创建日志目录
touch /root/mongo/logs/logs.log     # 创建日志文件
chmod -R 777 /root/mongo/

2.4 启动与连接

服务端启动(进入mogo的bin目录)
./mongod                            # --dbpath="C:/data"  该参数用于指定mongo数据的存放位置

客户端连接:
./mongo

由于启动的可选配置属性太多,推荐使用配置文件启动,方便管理:

vim /etc/mongo.conf
dbpath=/root/mongo/data/
logpath=/root/mongo/logs/logs.log
logappend=true 
fork=true     #守护进程运行,配置该行后,则不可使用 -f 启动参数 
port=27017 

启动:
./mongod --config /etc/mongo.conf

关闭:
直接关闭:CTRL+C,不要关闭ssh窗口直接退出(会出错)
后台启动关闭:在客户端使用 db.shutdownServer()

以服务形式启动关闭:
sudo service mongod start
sudo service mongod stop


如果是在阿里云安装后,外网需要连接还需要额外配置:
1 阿里云开放27017端口
2 默认情况下,阿里云只绑定了127.0.0.1本地地址,只能本地访问,需要在配置文件加上阿里云内网地址:
bind_ip:127.0.0.1,阿里云内网地址        # 这里或者直接输入0.0.0.0


shell远程连接命令:
mongo mydb --username user1  --host 192.168.99.100 --port 27017 --password

注意 mongodb默认端口是27018,如果没有设置数据目录,默认为/data/db
关闭命令:采用CTRL+C或者shutdownServer()命令或者kill -2 PID(-15也可以,但是-9会损坏数据)。

2.4 GUI工具

常见的mongodb可视化工具有官方的Compass,笔者推荐最新版的Navicat!

2.5 常见命令选项

启动命令选项:

port=27017 #端口  
dbpath #数据库存文件存放目录  
logpath #日志文件存放路径  
logappend=true #使用追加的方式写日志  
fork=false #不以守护程序的方式启用,即不在后台运行  
maxConns=100 #最大同时连接数  
noauth=true #不启用验证  
journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)

2.6 开机启动

使用yum安装的mongodb已经注册为系统服务,直接支持开机启动。

如果是解压包安装的MongoDB需要在/etc/init.d目录下创建service脚本才能注册为服务,以实现开机启动。

2.7 错误解决

MongoDB未正常关闭,可能会无法再次启动,可以删除data目录下的mongod.lock文件。

三 MongoDB基本使用

3.0 MongoDB数据库目录

  • bsondump bson转换工具

  • mongodump 逻辑备份工具

  • mongorestore 逻辑恢复工具

  • mongoexport 数据导出工具

  • mongoimport 数据导入工具

  • mongofiles GridFS文件工具

  • mongooplog 日志复制工具

  • mongoperf 性能检查工具

  • mongos 分片路由工具

  • mongostat 状态监控工具

  • mongotop 读写监控工具

3.1 MongoDB数据库的组成

MongoDB数据逻辑结构:
MongoDB的数据主要由文档(Document)、集合(Collection)、数据库(Database)三部分组成,文档相当于关系数据中的一行数据,多个文档组成的一个集合相当于关系数据库中的表,多个集合逻辑上组织在一起,就相当于数据库。

数据库的命名:

  • 数据库名不能是空字符串

  • 数据库名不能包含空格,空格符,$等特殊字符

  • 数据库名推荐全小写

  • 数据库名最多64字节

MongoDB有一些特殊的数据库:

  • admin:类似root数据库,在admin数据库中添加的用户会自动继承所有的数据库的权限,一些特定的服务器端命令也只能从这个数据运行,比如列出所有数据库、关闭服务器等等

  • local:该数据库永远不会被复制,可以用来存储限于本地单台服务器的任意集合。

  • config:当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的配置信息。

MongoDB启动后,由实例和数据库组成,一般情况下,一个MongoDB服务包含一个实例与多个与之对应的数据库,特殊情况下,允许一个服务器上有多个实例和多个数据库。

Mongo默认的数据目录是/data/db,所有的数据文件都在此目录下,每个数据库都包含一个.ns文件和一些数据库文件。

Mongo内部有预分配空间的机制,始终保持额外的空间和空余的数据文件,可以有效避免数据暴增而带来的磁盘压力。数据不断增加时,Mongo会新分配文件来存储,每次分配的文件大小是上一个数据文件大小的两倍,每个数据文件最大为2G。

Mongo数据库中每个集合和每个索引都有对应的命名空间,这些命名空间的元数据都集中在*.ns文件中。命名空间最大长度为121字节,实际应用中小于100字节。

3.2 MongoDB集合

集合就是一组文档,类似关系型数据库中的表。集合是无模式的,也就是说集合里文档是各式各样的,不会像关系型数据库那样规定表的字段结构。

集合命名规范:

  • 不能使空字符串""

  • 不能含有\\0,即空字符串,这个字符表示集合的结尾

  • 不能以system.开头,这时系统集合保留的前缀

  • 不推荐使用保留字$,因为某些系统生成的集合包含该字符

集合中还能包含子集合,推荐使用.字符分开命名表示子集合。比如有一个项目集合project,含有子集合员工集合,可以命名为project.member

3.3 MongoDB文档

文档中的键类似于关系型数据库的字段。

命名规范:

  • 空格符(\\0)在键中表示键的结尾,所以键中不能包含空格符

  • 不建议包含$和.

  • 区分大小写,区分键值类型

  • 推荐不要以_开头

  • 键不能重复

文档的特点:

  • 每个文档都有一个唯一的键"_id",作用类似mysql中的id主键

  • 文档中的键值对是有序的,前后顺序不同就是不同的文档

  • 文档中的键值对,值可以是字符串、数字、日期等各种数据类型

  • 单个文档存储大小最大是16M(因为内存有限,不排除未来官方扩大范围)

四 MongoDB数据类型

MongoDB在JSON数据类型基础上做了一些额外扩展,称之为BASON,常见数据类型有:

数据类型文档表示方式说明
null{"key":null}空或者不存在的字段
布尔{"x": true}值有true和false两种
32位整数{"key": 8}Mongo会存储32位整数,在shell中显示会转换为64位浮点数
64位整数{"key": {"floatApprox": 8}}shell不可用,一般使用特殊的内嵌文档表示64位整数
64位浮点数{"x": 12.31} 或者 {"x":12}
字符串{"x":"hello"}
对象id{"x":ObjectId()}对象id是文档的12字节唯一ID
日期{"x": new Date()}

其他数据类型支持:正则表达式、JS代码、二进制数据、undefined未定义、数组以及各种内嵌的文档。

MongoDB3.4添加了新数据类型Decimal128,用于存储最多32位小数,与浮点数不同的是,该数值存储的是实际数据,例如9.99,在内存中就是9.99,而浮点数的9.99类似:9.9900000000000000213....所以金额操作一般使用该数据类型,可以避免精度缺失。

ObjectId:每个文档都有一个属性,为_id,保证每个文档的唯一性,可以自己去设置_id插入文档,如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID,objectID是一个12字节的十六进制数:

  • 前4个字节为当前时间戳

  • 接下来3个字节的机器ID

  • 接下来的2个字节中MongoDB的服务进程id

  • 最后3个字节是简单的增量值

MongoDB的日期类型需要注意的地方是:日期在Mongo中以标准纪元开始的毫秒数形式存储,忽略了时区,例如中国是东八区,默认情况下,把当前时间存入Mongo,会少8个小时。在Java中,Date的时间是23:00,到了Mongo中使用Date会是15:00。当然大部分Mongo驱动在内部已经帮我们处理好了这部分,可以直接忽略时区问题。


本文地址:https://www.stayed.cn/item/382

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。