分布式系列十五: MongoDB数据库
MongoDB 是基于分布式文件存储的数据库. 开发语言是C++. 具有高性能,可扩展的特点. 是NoSql中最像关系数据库的.
什么是NoSql
NoSQL 是 Not only SQL 的缩写. 是对不同于传统的关系数据库的数据管理系统的统称. 一般用来存储超大规模数据, 且数据不需要有具体的模式, 可以横向扩展.
与关系数据库的对比
- RDB 存储结构化数据, 数据结构之间可能存在约束; NoSQL无固定模式,一般采用k-v方式, 无表关联等约束.
 - RDB 有规范的 SQL 语言; NoSQL无
 - RDB 有严格一致性和事务特征; NoSQL只要求最终一致性, 无事务属性
 - 比 RDB 具有高性能, 可扩展和可伸缩性
 
NoSQL 分类
列存储: HBase ; Cassandra ; HyperTable
按列查询性能有优势; 按列存储方便压缩
文档存储: MongoDB, CounchDB
文档结构存储, 类似Json, 可以为某些字段建立索引. 类似关系数据库.
key-value 存储: MemCache,Redis
图存储: Neo4J
对象存储:
XML数据库
CAP 理论
满足 AP.
MongoDB 与 RDB 的概念对比
| 关系数据库 | MongoDB | 说明 | 
|---|---|---|
| DataBase | DataBase | 数据库 | 
| Table | Collection | 数据表/集合 | 
| Row | Document | 数据行/文档 | 
| Column | Field | 数据列/数据字段 | 
| Index | Index | 索引 | 
| Primary Key | Object ID | 主键/MongoDB对象标识 | 
MongoDB 存储的格式是BSON, 是二进制的Json.
MongoDB 的数据类型
略,
MongoDB 集群
包含: RouteServer(路由 对应的执行文件为Mongos.exe), ConfigServer(配置) , ReplicaSets (副本集合 对应的执行文件为mongod.exe), 仲裁Server
集群模式
- 主从 master/slave 与mysql主从, 或者redis主从一样
 - 副本集 master/slave/arbiter(仲裁) 类似redis的sentinel机制
 - 混合模式
 
步骤
- 主从配置(主节点挂掉就不可用)
 
mongo.cfg 文件中
# 主配置
master=true
source=192.1.68.1.111:21897
# 从配置
slave=true
source=192.1.68.1.111:21897
- 副本集一(仲裁节点单点故障会导致服务不可用)
 
replset=shard002  #同一集中的配置一样
执行命令:
cfg={_id:"shard001",members:{{_id:0,host:'192.168.1.111:27897',priority:9},{_id:0,host:'192.168.1.112:27897',priority:1},{_id:0,host:'192.168.1.112:27897',arbiterOnly:true}}}
rs.initiate(cfg);
- 副本集二
 
配置与副本集一样,命令执行如下:
cfg={_id:"shard002",members:{{_id:0,host:'192.168.1.111:27899'},{_id:0,host:'192.168.1.112:27899'},{_id:0,host:'192.168.1.112:27899'}}}
rs.initiate(cfg);
混合使用
前置: M-S-S 的副本集以及M-S-A的副本集
新增一个副本集, 为config服务, 配置中添加节点并添加变量启动
configsvr=true
- 新增路由服务器(只需要logpath,不需要dbpath), 
mongos -f ..启动 
configdb=configrs/192.168.1.111:28102,192.168.1.112:28102,192.168.1.113:28102
目前有了一组配置服务器, 一组路由服务器, 两组副本集服务器
关联路由/shard:
sh.addShard("shard001/192.168.1.111:27897")以及sh.addShard("shard002/192.168.1.111:27899")启用切片:
use dbName sh.enableSharding("dbNzame")sh.shardCollections("dbName.collectionName",{"name","hashed"})分片的服务器需要使用
--shardsvr=true所以需要在数据副本集的cfg中添加shardsvr=true
MongoDB的适用场景和不适用场景
适用于:
- 实时插入, 更新和查询.
 - 数据缓存, mongoDB的索引会同步到内存, 数据存储在磁盘中
 - 大量数据存储,数据粒度较大, 数量较多
 - 高伸缩性场景
 - 对象或Json存储
 
不适用于:
- 事务性系统, 银行会计系统等
 - BI 数据, BI数据库更合适
 - 复杂SQL查询
 
安装
参看官方文档
- fork启动: 
mongod --dbpath=/opt/mongo/data/ --logpath=/opt/mongo/log/mongo.log --logappend --bind_ip=192.168.1.111 --fork 
可以使用配置文件将参数配置到 mongo.cfg 类似properties文件的格式. 然后命令 mongod -f mongo.cfg 启动.
命令
use DBName;转到数据库, 或者创建db.DocName.insert({name:"docname"})插入数据db.DocName.find()或者db.DocName.findOne()查找db.DocName.update({name:"docname"},{$set:{age:18}},true,true)修改, 第三个参数为true则在查找不到记录的条件下新插入一条数据, 并设置属性列的值, 不影响其他属性; 第四个参数true表示批量var p = db.doc.findOne(); db.doc.update(p,{name:"other"})会删除其他的列值db.doc.remove({age:0})删除db.doc.drop()删除集合db.dropDatabase()删除库show collections查看集合show dbs查看数据库db.doc.insert()与db.doc.save()前者不允许键值重复, 后者若键值重复则插入更新时候,第二个参数的模式
$set:设置$unset:删除$incr: 增加$push: 数组增加元素$pushAll: 批量增加数组元素$addToSet: 有则不插入, 无则插入$pop: 数组删除其中的元素, 1为删除最后一个, -1为删除第一个$pull: 数组删除指定的值,$pullAll为批量操作
$each迭代runCommand()函数, 实现组合操作db.doc.find({条件},{指定键})查询模式db.doc.find({age:{$gte:18,$lte:25}},{_id:0,name:1})范围查找,显式name列$lt,$lte,$gt,$gte,$ne,$in,$nin,$or支持正则表达式,
find({name:/li/i})$not$all和 index ; index 使用.0 .1 这样的方式表示$size数组大小$slice数组切割limit(5)限制显式条数skip(10)跳过条数sort({age:1})排序, 1是正序, -1是逆序hasNext()结合while实现游标 , 注意: 游标默认10分钟会销毁var persons = db.person.find();
while(persons.hasNext()){
obj = person.next();
print(obj.name);
}
db.doc.find({$query:{name:"jim"},$snapshot:true})快照查询$query,$orderby,$maxscan,$min,$max,$hint,$explain,$snapshotdb.map.find({{gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3)查出离给定左表最近的是哪个点db.map.find({gis:{$within:{$box:[[50,50],[100,100]}}},{_id:0,gis:i})查询所有在两个坐标为对角线内的所有点db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:i})找出圆心为[56,80]半径50内的所有点count()查找计数db.runCommand({distinct:"persons",key:"country"}).valuespersons中有多少个国家, 去重后的值分组
db.runCommand(
    {
        group:{
            ns:"集合名字",
            key:"分组键",
            initial:"初始化累加器",
            $reduce:"分解器"
            condition: "条件",
            finalize:"完成器"
        }
    }
);
db.createUser({user:"admin",pwd:"123",roles:[{role:"dbAdmin",db:"dbName"}]})
系统相关的需先使用 use admin 切换到系统库 比如: 查询用户db.system.users.find()
db.system.users.remove({use:"admin"})删除用户db.runCommand({usersInfo:"admin",showPrivileges:true})查看用户权限db.changeUserPassword("admin","123456")修改密码db.auth("admin","123456")启用用户rs.slaveOk()设置允许在二级节点查询, 从节点上设置
mongodb 客户端使用
使用mongodb的官方驱动
- 依赖包
 
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.10.2</version>
</dependency>
- 代码
 
MongoClient mongo = new MongoClient("127.0.0.1", 27017);
DB db = new DB(mongo, "User");
DBCollection hiveUser = db.getCollection("hiveUser");
DBCursor cursor = hiveUser.find();
for (DBObject c : cursor) {
    System.out.println(c);
}
三方框架
- 依赖包
 
<!-- https://mvnrepository.com/artifact/org.mongodb.morphia/morphia -->
<dependency>
    <groupId>org.mongodb.morphia</groupId>
    <artifactId>morphia</artifactId>
    <version>1.3.2</version>
</dependency>
- 代码
 
Morphia morphia = new Morphia();
Datastore ds =morphia.createDatastore(new MongoClient("127.0.0.1", 27017),"hiveUser");
ds.save(new User("Test",3,19,0));
Query<User> query = ds.createQuery(User.class);
List<User> user = query.asList();
System.out.println(user.size());
Spring-data-mongodb
- 依赖包
 
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
- 配置
 
spring.data.mongodb.uri=mongodb://localhost/hiveUser
具体配置可以参考 org.springframework.boot.autoconfigure.mongo.MongoProperties
- 代码
 
@Component
public class SpringDataMongoTest {
    @Autowired
    private MongoTemplate mongoTemplate;
    public void print(){
        Set<String> collections = mongoTemplate.getCollectionNames();
        System.out.println(collections);
        //查询
        Query query = new Query();
        List<User> list = mongoTemplate.find(query,User.class);
    }
}
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Document("hiveUser") //指定collection
public class User {
    private String name;
    private Integer id;
    private Integer age;
    private Integer sex;
}
注意: 操作实体上需要添加 @Document(collection="hiveUser") 才可以被查询.
分布式系列十五: MongoDB数据库的更多相关文章
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
		
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
 - 补习系列(16)-springboot mongodb 数据库应用技巧
		
目录 一.关于 MongoDB 二.Spring-Data-Mongo 三.整合 MongoDB CRUD A. 引入框架 B. 数据库配置 C. 数据模型 D. 数据操作 E. 自定义操作 四.高级 ...
 - 聊聊MySQL的加锁规则《死磕MySQL系列 十五》
		
大家好,我是咔咔 不期速成,日拱一卒 本期来聊聊MySQL的加锁规则,知道这些规则后可以判断SQL语句的加锁范围,同时也可以写出更好的SQL语句,防止幻读问题的产生,在能力范围内最大程度的提升MySQ ...
 - MongoDB副本集配置系列十:MongoDB  local库详解和数据同步原理
		
1:local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 gechongrepl:PRIMARY> use local switched to db local gechong ...
 - MongoDB (五) MongoDB 数据库操作
		
一.MongoDB创建数据库: use 命令 MongoDB use DATABASE_NAME 用于创建数据库.该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库. 语法: use D ...
 - 分布式进阶(十五)ZMQ
		
我们为什么需要ZMQ 目前的应用程序很多都会包含跨网络的组件,无论是局域网还是因特网.这些程序的开发者都会用到某种消息通信机制.有些人会使用某种消息队列产品,而大多数人则会自己手工来做这些事,使用TC ...
 - 【Qt编程】基于Qt的词典开发系列<十五>html特殊字符及正则表达式
		
1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们 ...
 - 分布式系列十二: Redis高级主题
		
持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件 ...
 - 分布式系列十: Redis安装和命令
		
redis是一个开源的, 内存数据结构存储, 一般用来作为数据库,缓存和消息代理. Redis的优势 多种数据结构 字符类型String 散列类型Hash 列表类型List 集合类型Set 有序集合类 ...
 
随机推荐
- 【深色模式】macOS Mojave+Visual Studio for Mac+FineUICore多图赏析!
			
全面开启深色模式,今早成功升级到 macOS Mojave,下面就来欣赏一下吧. 点击图片,查看大图 1. 下载 macOS Mojave 2. 安装成功,开启深色模式 3. 来一张桌面截图 4. 开 ...
 - 手写token解析器、语法解析器、LLVM IR生成器(GO语言)
			
最近开始尝试用go写点东西,正好在看LLVM的资料,就写了点相关的内容 - 前端解析器+中间代码生成(本地代码的汇编.执行则靠LLVM工具链完成) https://github.com/daibinh ...
 - API简介
			
概述 API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档.这些类将底层的代码 ...
 - Linux系统安装jdk教程
			
本文仅仅适用于刚刚接触Linux系统的童鞋,毕竟本人也才刚刚玩这个东西,在此记录下以便于以后能查阅及其他童鞋能进行参考,本文为原创随笔,如需转发,请标明出处,谢谢: 此处我采用的是用VMware搭建的 ...
 - SSM(Spring + Springmvc + Mybatis)框架面试题
			
JAVA SSM框架基础面试题https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(Spring + Springmvc + M ...
 - 微信小程序-表单笔记
			
发布页——向云端数据库上传多行文字和4张图片 第6,8行注释掉和不注释掉都可以实现数据上传 var _this = this; wx.cloud.callFunction({ name: 'searc ...
 - mysql中explain的type的解释
			
type -- 连接类型 type意味着类型,这里的type官方全称是“join type”,意思是“连接类型”,这样很容易给人一种错觉觉得必须需要俩个表以上才有连接类型.事实上这里的连接类型并非字面 ...
 - Idea在@Autowired注入时报错
			
Could not autowire. No beans of 'UserDao' type found 如图,是因为idea检测能力太强,一旦没有找到实现类就会报错,但是我试了,这里其实是注入进来了 ...
 - Vue.js 2.x笔记:状态管理Vuex(7)
			
1. Vuex简介与安装 1.1 Vuex简介 Vuex是为vue.js应用程序开发的状态管理模式,解决的问题: ◊ 组件之间的传参,多层嵌套组件之间的传参以及各组件之间耦合度过高问题 ◊ 不同状态中 ...
 - webpack4 学习 --- 处理静态资源
			
webpack 是利用loader 来处理各种资源的,wepback的配置基本上就是为各种资源文件,指定不同类型的loader. 1,处理css 最基本的css 处理loader 是css-loade ...