←←←←←←←←←←←← 快!点关注java
MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库mysql
(1)MongoDB提出的是文档、集合的概念,使用BSON(类JSON)做为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。程序员
{ username:'123', password:'123' }
使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大加强。web
(2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提高从节点为主节点,达到故障转移。redis
(3)数据模型由于是面向对象的,因此能够表示丰富的、有层级的数据结构,好比博客系统中能把“评论”直接怼到“文章“的文档中,而没必要像myqsl同样建立三张表来描述这样的关系。sql
(1)文档数据类型mongodb
SQL类型的数据库是正规化的,能够经过主键或者外键的约束保证数据的完整性与惟一性,因此SQL类型的数据库经常使用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正由于MongoDB少了一些这样的约束条件,可让数据的存储数据结构更灵活,存储速度更加快。shell
(2)即时查询能力数据库
MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优势,相比于同类型的NoSQL redis 并无上述的能力。缓存
(3)复制能力
MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是能够提供自动故障转移、扩展读能力。
(4)速度与持久性
MongoDB的驱动实现一个写入语义 fire and forget ,即经过驱动调用写入时,能够当即获得返回获得成功的结果(即便是报错),这样让写入的速度更加快,固然会有必定的不安全性,彻底依赖网络。
MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当须要插入的时候会先往日志里面写入记录,再完成实际的数据操做,这样若是出现停电,进程忽然中断的状况,能够保障数据不会错误,能够经过修复功能读取Journaling日志进行修复。
(5)数据扩展
MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每个服务器里面存储的数据都是同样大小。
MongoDB核心服务器主要是经过mongod程序启动的,并且在启动时不需对MongoDB使用的内存进行配置,由于其设计哲学是内存管理最好是交给操做系统,缺乏内存配置是MongoDB的设计亮点,另外,还可经过mongos路由服务器使用分片功能。
MongoDB的主要客户端是能够交互的js shell 经过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据同样使用js语法查询MongoDB的数据,另外还提供了各类语言的驱动包,方便各类语言的接入。
mongodump和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。
mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据须要支持多格式时有用。mongoimport还能用与大数据集的初始导入,可是在导入前顺便还要注意一下,为了能充分利用好mongoDB一般须要对数据模型作一些调整。
mongosniff,网络嗅探工具,用来观察发送到数据库的操做。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。
所以,能够总结获得,MongoDB结合键值存储和关系数据库的最好特性。由于简单,因此数据极快,并且相对容易伸缩还提供复杂查询机制的数据库。MongoDB须要跑在64位的服务器上面,且最好单独部署,由于是数据库,因此也须要对其进行热备、冷备处理。
由于本篇文章不是API手册,全部这里对shell的使用也是基础的介绍什么功能能够用什么语句,主要是为了展现使用MongoDB shell的方便性,若是须要知道具体的MongoDB shell语法能够查阅官方文档。
(1)、切换数据库
use dba
建立数据库并非必须的操做,数据库与集合只有在第一次插入文档时才会被建立,与对数据的动态处理方式是一致的。简化并加速开发过程,并且有利于动态分配命名空间。若是担忧数据库或集合被意外建立,能够开启严格模式
(2)、插入语法
db.users.insert({username:"smith"}) db.users.save({username:"smith"})
(3)、查找语法
db.users.find() db.users.count()
(4)、更新语法
db.users.update({username:"smith"},{$set:{country:"Canada"}}) //把用户名为smith的用户的国家改为Canada db.users.update({username:"smith"},{$unset:{country:1}}) //把用户名为smith的用户的国家字段给移除 db.users.update({username:"jones"},{$set:{favorites:{movies:["casablance","rocky"]}}}) //这里主要体现多值修改,在favorties字段中添加多个值 db.users.update({"favorites.movies":"casablance"},{$addToSet:{favorites.movies:"the maltese"}},false,true) //多项更新
(5)、删除语法
db.foo.remove() //删除全部数据 db.foo.remove({favorties.cities:"cheyene"}) //根据条件进行删除 db.drop() //删除整个集合
(6)、索引相关语法
db.numbers.ensureIndex({num:1}) //建立一个升序索引 db.numbers.getIndexes() //获取所有索引
(7)、基本管理语法
show dbs //查询全部数据库 show collections //显示全部表 db.stats() //显示数据库状态信息 db.numbers.stats() //显示集合表状态信息 db,shutdownServer() //中止数据库 db.help() //获取数据库操做命令 db.foo.help() //获取表操做命令 tab 键 //能自动帮咱们补全命令
以上的命令只是简单实例,假设若是你以前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪个更简单呢?若是你使用的是java驱动去操做MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式同样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主以前熟悉ES6,因此入手MongoDB js shell完成没问题,也正由于这样简洁,完善的查询机制,深深的爱上了MongoDB。
(1)、使用maven引入jar包
这里引用的是最新的驱动包,提供了一套新的访问链接方式
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>3.8.0-beta3</version> </dependency>
(2)、建立一个访问客户端
MongoClient client = MongoClients.create(“mongodb://10.201.76.94:27017”);
(3)、获取集合数量
public long count() { MongoClient client = this.getClient(); MongoCollection<Document> collections= client.getDatabase("mongodb_db_name").getCollection("mongodb_collection_name"); return collections.count(); }
(4)、查询集合
public List<Document> find(Document params,Bson sort,int skip,int limit) { MongoClient client = this.getClient(); MongoCollection<Document> collections= client.getDatabase("mongodb_db_name").getCollection("mongodb_collection_name"); List<Document> list = new ArrayList<Document>(Integer.valueOf(config.getPro("sync_limit"))); collections.find(params).sort(sort).skip(skip).limit(limit).forEach(new Block<Document>() { @Override public void apply(Document document) { list.add(document); } }); return list; }
这里只举例了简单的连接与简单的MongoDB操做,可见其操做的容易性。使用驱动时是基于TCP套接字与MongoDB进行通讯的,若是查询结果较多,刚好没法所有放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。
插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,可是该行为能够经过配置配置,能够经过安全模式开启,安全模式能够校验服务器端插入的错误。
欢迎你们加入:963,,,944,,,895,免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思惟导图
秃顶程序员的不易,看到这里,点了关注吧! 点关注,不迷路,持续更新!!!