这是极客时间-MongoDB高手课的学习笔记.
按照数据库排名网站db-engines.com的统计,最近几年MongoDB一直保持在前四五名,前面几位是年龄30多岁的关系型数据库(Oracle,Mysql,SQLServer,PostgreSQL).
作为一个新时代的成熟数据库产品,MongoDB最大的优势是开发效率的显著提升和卓越的横向扩展能力.
MongoDB使用了类似对象模型的JSON数据结构,从而大幅度的简化了数据库模式设计/ORM层编码的工作.
如果你是开发者,MongoDB可以让你花更少的时间在数据库上,专注于业务变成
如果你是DBA,它可以帮你解决高可用,高性能以及横向扩展的痛点
如果你是架构师或者产品经理,MongDB是一个非常灵活的数据库,可以快速响应业务的需求变化.
MongoDB是五大数据库中唯一的非关系型数据库,即NoSQL,这就意味着,一般技术人员所熟知的数据库知识,可能在开始使用MongoDB的时候,不一定会有很大帮助;
相反,如果你不摒弃那些传统的关系型数据库理念,大概率上你会用一种错误的方式去设计和使用它.最终无法达到最想要的效果.
具体来说,有这几个难点:
节点建议是3个以上,奇数,投票机制
默认Driver连接主节点(Primary)
滚动服务就是不下线升级,无缝升级
https://www.runoob.com/mongodb/mongodb-tutorial.html
图形化管理工具使用compass
导入测试数据:
从github/gitee上 下载dump.tar.gz文件
● tar -xvf dump.tar.gz
● mongorestore -h localhost:27017 (恢复数据文件,默认从当前目录找dump文件夹)
mongorestore 这个命令,在新版本的mongodb server中已经没有了,而是专门抽出来了一个mongodb-database-tools,需要从官网单独下载安装.
根据子文档的字段查询,使用{“from.country” : “China”} 这种方式
基于之前已经导入的mock订单数据
聚合查询所有记录,所以聚合字段(_id)为空
db.orders.aggregate([
{$group:
{
_id:null,
total:{$sum: "$total"}
}
}
])
通过compass更方便的看出每个stage的中间结果,直观:
之前我们已经安装单机版的了,所以直接多几个配置文件,启动实例就好
# /data/db1/mongod.conf
systemLog:
destination: file
path: /data/mongotest/replica/db1/mongod.log # log path
logAppend: true
storage:
dbPath: /data/mongotest/replica/db1 # data directory
net:
bindIp: 0.0.0.0
port: 28017 # port
replication:
replSetName: rs0
processManagement:
fork: true
hostname -f
验证一下有没有配置成功主机名# 首先连接primary节点,mongo localhost:28017
> rs.initiate() # 输入命令,初始化
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "instance-3myjwcaa:28017",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1600658268, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1600658268, 1)
}
rs0:SECONDARY> # 这里按回车进入PRIMARY
rs0:PRIMARY>
rs0:PRIMARY> rs.status() # 查看rs复制集的状态,这里面也可以看到hostname
rs0:PRIMARY> rs.add("instance-name:28018") # 添加一个实例道复制集
rs0:PRIMARY> rs.add("instance-name:28019") # 再添加一个实例道复制集
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1600658593, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1600658593, 1)
}
# 这时候再通过rs.status()查看的话,members有三个了,一个primary,两个secondary
# 但是还要进入secondary的节点,配置可读,mongo localhost:28018
rs.slaveOk()