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);
  • 混合使用

    1. 前置: M-S-S 的副本集以及M-S-A的副本集

    2. 新增一个副本集, 为config服务, 配置中添加节点并添加变量启动

    configsvr=true
    1. 新增路由服务器(只需要logpath,不需要dbpath), mongos -f ..启动
    configdb=configrs/192.168.1.111:28102,192.168.1.112:28102,192.168.1.113:28102
    1. 目前有了一组配置服务器, 一组路由服务器, 两组副本集服务器

      • 关联路由/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 , $snapshot

  • db.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"}).values persons中有多少个国家, 去重后的值

  • 分组

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数据库的更多相关文章

  1. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. 补习系列(16)-springboot mongodb 数据库应用技巧

    目录 一.关于 MongoDB 二.Spring-Data-Mongo 三.整合 MongoDB CRUD A. 引入框架 B. 数据库配置 C. 数据模型 D. 数据操作 E. 自定义操作 四.高级 ...

  3. 聊聊MySQL的加锁规则《死磕MySQL系列 十五》

    大家好,我是咔咔 不期速成,日拱一卒 本期来聊聊MySQL的加锁规则,知道这些规则后可以判断SQL语句的加锁范围,同时也可以写出更好的SQL语句,防止幻读问题的产生,在能力范围内最大程度的提升MySQ ...

  4. MongoDB副本集配置系列十:MongoDB local库详解和数据同步原理

    1:local库是MongoDB的系统库,记录着时间戳和索引和复制集等信息 gechongrepl:PRIMARY> use local switched to db local gechong ...

  5. MongoDB (五) MongoDB 数据库操作

    一.MongoDB创建数据库: use 命令 MongoDB use DATABASE_NAME 用于创建数据库.该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库. 语法: use D ...

  6. 分布式进阶(十五)ZMQ

    我们为什么需要ZMQ 目前的应用程序很多都会包含跨网络的组件,无论是局域网还是因特网.这些程序的开发者都会用到某种消息通信机制.有些人会使用某种消息队列产品,而大多数人则会自己手工来做这些事,使用TC ...

  7. 【Qt编程】基于Qt的词典开发系列<十五>html特殊字符及正则表达式

    1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们 ...

  8. 分布式系列十二: Redis高级主题

    持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件 ...

  9. 分布式系列十: Redis安装和命令

    redis是一个开源的, 内存数据结构存储, 一般用来作为数据库,缓存和消息代理. Redis的优势 多种数据结构 字符类型String 散列类型Hash 列表类型List 集合类型Set 有序集合类 ...

随机推荐

  1. 洛谷-p4555

    题意:给你一个串,问你以i结尾的回文串加上以i+1开头的回文串的最大长度 解题思路:回文自动机板子题,记录下每次正着添加字符的时候,当前字符能够到达的最大回文子串的长度和倒着添加字符的时候,能够到达的 ...

  2. 小小知识点(十一)——MATLAB中fftshift的作用

  3. mysql-笔记-datetime

    1 adddate(date,interval expr unit)--同 date_add() select date_add('2019-4-20',interval 31 day); selec ...

  4. windows编程 进程的创建销毁和分析

    Windows程序设计:进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,在Windows编程环境下,主要由两大元素组成: • 一个是操作系统用来管理进程的内核对象.操作系统使用内 ...

  5. React Native动画总结

    最近在使用react native进行App混合开发,相对于H5的开发,RN所提供的样式表较少,RN中不能使用类似于css3中的动画,因此,RN提供了Animated的API 1.写一个最简单的动画 ...

  6. Appium环境搭建-精简版

    Appium自动化环境准备 安装配置JDK 下载Android SDK并配置环境变量 安装模拟器或连接真机 安装appium desktop 安装python和pycharm (开发语言和开发工具) ...

  7. Python——pyqt5——消息框(QMessageBox)

    一.提供的类型 QMessageBox.information 信息框 QMessageBox.question 问答框 QMessageBox.warning 警告 QMessageBox.ctit ...

  8. 关系型数据库 VS 非关系型数据库

    一.关系型数据库? 1.概念 关系型数据库是指采用了关系模型来组织数据的数据库.简单来说,关系模式就是二维表格模型. 主要代表:SQL Server,Oracle,Mysql,PostgreSQL. ...

  9. Luogu4491 [HAOI2018]染色 【容斥原理】【NTT】

    题目分析: 一开始以为是直接用指数型生成函数,后来发现复杂度不对,想了一下容斥的方法. 对于有$i$种颜色恰好出现$s$次的情况,利用容斥原理得到方案数为 $$\binom{m}{i}\frac{P_ ...

  10. vivado2016.1下载程序出错:End of startup status: LOW

    现象 使用JTAG下载程序,发现刚开始下载就出现了End of startup status: LOW错误.但能检测到芯片,证明JTAG没烧毁. 流程 前几次下载都没有问题,然后就有问题了. (1)怀 ...