mongo 文档型数据库 是nosql数据库的一种
版本 最新版 4.4
mongo 使用场景
- high performance 高并发读写
- high storage 高效存储和高效访问 TB PB
- high scalability && high Availability 高可扩展和高可用性
- 社交朋友圈 地理位置 附近的人
- 游戏场景 装备 积分
- 物流 业务状态的不断变更
- 物联网 日志信息
- 视频直播 用户信息 点赞等
mysql & mongo
SQL术语 | Mongo术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据库行/文档 |
column | field | 字段/域 |
index | index | 索引 |
table join | 表连接 mongo不支持 | |
嵌入文档 | mongo利用嵌入式文档代替表连接 | |
primary key | primary key | Mongo自动将_id设置为主键 |
mongo 中的数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
mongo windows 单体安装
下载并安装Mongodb(可以在MongoDB官网下载安装包:https://www.mongodb.com/download-center#community)
mongo linux 安装
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.5.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.5.tgz -C /usr/local
mv mongodb-linux-x86_64-rhel70-4.4.5 /usr/local/mongodb
mkdir data logs conf
cd logs/
touch mongodb.logs
mongodb.conf
port=27017
bind_ip=0.0.0.0
logpath=/usr/local/mongodb/myrs_17017/logs/mongod.logs
dbpath=/usr/local/mongodb/myrs_27017/data/db
logappend=true
pidfilepath=/usr/local/mongodb/myrs_27017/bin/mongod.pid
fork=true
oplogSize=1024
replSet=myrs
/etc/systemd/system/mongodb.service
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
RuntimeDirectory=mongodb
RuntimeDirectoryMode=0751
PIDFile=/usr/local/mongodb/bin/mongodb.pid
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongodb.conf
ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/conf/mongodb.conf
PrivateTmp=false
[Install]
WantedBy=multi-user.target
启动
./mongod --bind_ip_all -dbpath=/usr/local/mongodb/data -logpath=/usr/local/mongodb/logs/mongodb.log -logappend -port=27017 -fork
systemctl start mongodb.service #启动服务
systemctl stop mongodb.service #停止服务
systemctl restart mongodb.service #重新启动服务
systemctl status mongodb.service #查看服务当前状态
systemctl enable mongodb.service #设置开机自启动
systemctl disable mongodb.service #停止开机自启动
mongo 创建用户
use admin
db.createUser({
user:'admin',
pwd:'123456',
roles:[{role:'root',db:'admin'}]
})
mongo 增删改查
# 创建数据库
use runoob;
# 插入内容
db.runoob.insert({"name":"菜鸟教程"});
# 删除数据库
db.dropDatabase();
# 创建集合
db.createCollection("集合名");
# 删除集合
db.collection.drop();
# 插入集合
db.comment.insert(集合);
# 插入多个
db.comment.insertmany(集合);
# 查询一条
db.collection.findOne();
# 投影查询
db.collection.find({条件},{展示字段:1, 不展示字段:0});
# 查询集合 and
db.collection.find({key1:value1, key2:value2}).pretty();
# 查询集合 or
db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty();
# 查询范围 $gt $gte $lt $lte
db.col.find({likes : {$gt : 100}});
# limit
db.col.find({},{"title":1,_id:0}).limit(2);
# sort 1 升序 -1 降序
db.COLLECTION_NAME.find().sort({KEY:1});
# skip 跳过
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER);
# 覆盖修改
db.comment.update({_id:1}, {likenum:NumberInt(1001)});
# 局部修改
db.comment.update({_id:1}, {$set: {likenum:NumberInt(1001)}});
# 删除
db.comment.remove({_id:1});
mongo 索引
#索引创建
db.collection.createIndex(keys, options);
#查询索引
db.col.getIndexes()
#删除集合所有索引
db.col.dropIndexes()
#删除索引
db.col.dropIndex("索引名称")
mongo 聚合函数
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
求和
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]);
求平均
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]);
最小值
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]);
在结果文档中插入值到一个数组中。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
mongo 集群搭建
mongo 事务的支持
mongo 从4.0版本后支持事务处理
事务只能在复制集下才能生效,并不支持在单点模式下!
事务操作 事务作用在session上
session=db.getMongo().startSession();
session.startTransaction();
coll_2=session.getDatabase("test").coll_2;
coll_2.insert({xy:"syz"})
use test
//未查到
db.coll_2.find({});
session.commitTransaction();
//成功插入
db.coll_2.find({});
//回滚事务操作
session.abortTransaction();
mongo 命令
https://www.cnblogs.com/phpzhou/articles/5390042.html
mongo 复制(副本集) 数据一致
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
replication.png
搭建副本集
一主一从一仲裁
启动
./mongod --bind_ip_all --replSet 'myrs' -dbpath=/usr/local/mongodb/myrs_27017/data/ -logpath=/usr/local/mongodb/myrs_27017/logs/mongodb.logs -logappend -port=27017 -fork
./mongod --bind_ip_all --replSet 'myrs' -dbpath=/usr/local/mongodb/myrs_27018/data/ -logpath=/usr/local/mongodb/myrs_27018/logs/mongodb.logs -logappend -port=27018 -fork
./mongod --bind_ip_all --replSet 'myrs' -dbpath=/usr/local/mongodb/myrs_27019/data/ -logpath=/usr/local/mongodb/myrs_27019/logs/mongodb.logs -logappend -port=27019 -fork
配置
#数据存放目录
dbpath=/usr/local/mongodb/myrs_27017/data/db
#日志存放目录
logpath=/usr/local/mongodb/myrs_27017/logs/mongod.logs
#进程文件,方便停止mongodb
pidfilepath=/usr/local/mongodb/myrs_27017/bin/mongod.pid
#为每一个数据库按照数据库名建立文件夹存放
directoryperdb=true
#以追加的方式记录日志
logappend=true
# 设置副本集名称id与replSet:rs0 要一致,rs0可以是自定义的名称
replSet=myrs
#mongodb所绑定的ip地址
bind_ip=0.0.0.0
#mongodb进程所使用的端口号,默认为27017
port=27017
#mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
oplogSize=10000
#以后台方式运行进程
fork=true
#不预先分配存储
noprealloc=true
#数据存放目录
dbpath=/usr/local/mongodb/myrs_27018/data/db
#日志存放目录
logpath=/usr/local/mongodb/myrs_27018/logs/mongod.logs
#进程文件,方便停止mongodb
pidfilepath=/usr/local/mongodb/myrs_27018/bin/mongod.pid
#为每一个数据库按照数据库名建立文件夹存放
directoryperdb=true
#以追加的方式记录日志
logappend=true
# 设置副本集名称id与replSet:rs0 要一致,rs0可以是自定义的名称
replSet=myrs
#mongodb所绑定的ip地址
bind_ip=0.0.0.0
#mongodb进程所使用的端口号,默认为27018
port=27018
#mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
oplogSize=10000
#以后台方式运行进程
fork=true
#不预先分配存储
noprealloc=true
#数据存放目录
dbpath=/usr/local/mongodb/myrs_27019/data/db
#日志存放目录
logpath=/usr/local/mongodb/myrs_27019/logs/mongod.logs
#进程文件,方便停止mongodb
pidfilepath=/usr/local/mongodb/myrs_27019/bin/mongod.pid
#为每一个数据库按照数据库名建立文件夹存放
directoryperdb=true
#以追加的方式记录日志
logappend=true
# 设置副本集名称id与replSet:rs0 要一致,rs0可以是自定义的名称
replSet=myrs
#mongodb所绑定的ip地址
bind_ip=0.0.0.0
#mongodb进程所使用的端口号,默认为27019
port=27019
#mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
oplogSize=10000
#以后台方式运行进程
fork=true
#不预先分配存储
noprealloc=true
连接节点
config = {_id: 'myrs', members: [
{_id: 0, host: '192.168.139.129:27017'},
{_id: 1, host: '192.168.139.129:27018'},
{_id: 2, host: '192.168.139.129:27019',"arbiterOnly":true}]
}config = {_id: 'myshardrs01', members: [
{_id: 0, host: '192.168.139.129:27018'},
{_id: 1, host: '192.168.139.129:27118'},
{_id: 2, host: '192.168.139.129:27218',"arbiterOnly":true}]
}
rs.initiate(config);
rs.status();
主节点添加数据后 从节点可以进行数据同步
登陆主节点27017
db.comment.insert({"articleid":"100002","content":"今天天气真好,阳光明媚","userid":"1003","nickname":"jack","createdatetime":new Date()})
mongo --host localhost --port 27018
rs.slaveOk(true)
rs方法
image.png
主节点选举原则
触发条件:
主节点宕机、主节点网络不可达、人工干预
1) 票数最高
2) 大多数成员支持
mongo 分片 数据不一致
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
使用分片场景
- 复制所有的写入操作到主节点
- 延迟的敏感数据会在主节点查询
- 单个副本集限制在12个节点
- 当请求量巨大时会出现内存不足。
- 本地磁盘不足
- 垂直扩展价格昂贵
组成结构:
分片 | 路由 | 配置 |
---|---|---|
负责存储数据库数据。 | 负责将查询和写操作路由到对应Shard节点中 | 用于存储集群和Shard节点的元数据,即各Shard节点中包含哪些数据的信息。 |
mongo Java
mongo 整合 spring cloud
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
yml
server:
port: 8080
spring:
application:
name: yzl-mongo
#数据源配置
data:
mongodb:
#主机地址
host: 192.168.32.137
#默认端口时27017
#也可以使用url连接
#url: mongodb://192.168.32.137:27017/comment
port: 27017
database: comment
网友评论