mogodb能干嘛

MongoDB 是什么 ? 能干嘛 ?

1、MongoDB是什么?
2、为什么要用MongoDB?
3、主要特性
4、C/S服务模型
5、完善的命令行工具
6、几个shell实操
7、在Java中使用MongoDB


1、MongoDB是什么? MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库

2、为什么要用MongoDB?
(1)MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。

{
username:‘123’,
password:‘123’

使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。

(2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。

(3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。

3、主要特性
(1)文档数据类型
SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与唯一性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。

(2)即时查询能力
MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis 并没有上述的能力。

(3)复制能力
MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。

(4)速度与持久性
MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。

MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据操作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。

(5)数据扩展
MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个服务器里面存储的数据都是一样大小。

4、C/S服务模型
MongoDB核心服务器主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理最好是交给操作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由服务器使用分片功能。

MongoDB的主要客户端是可以交互的js shell 通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。

5、完善的命令行工具
mongodump和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。

mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。

mongosniff,网络嗅探工具,用来观察发送到数据库的操作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。

因此,可以总结得到,MongoDB结合键值存储和关系数据库的最好特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的服务器上面,且最好单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。

6、几个shell实操
因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅官方文档。

1、切换数据库
use dba
创建数据库并不是必须的操作,数据库与集合只有在第一次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或集合被意外创建,可以开启严格模式

2、插入语法
1db.users.insert({username:“smith”})
2db.users.save({username:“smith”})
3、查找语法
1 db.users.find()
2 db.users.count()
4、更新语法
1 db.users.update({username:“smith”},{KaTeX parse error: Expected 'EOF', got '}' at position 23: …untry:"Canada"}}̲) 2 //把用户名为smi…unset:{country:1}})
5 //把用户名为smith的用户的国家字段给移除
6
7 db.users.update({username:“jones”},{KaTeX parse error: Expected 'EOF', got '}' at position 48: …nce","rocky"]}}}̲) 8 //这里主要体现多值…addToSet:{favorites.movies:“the maltese”}},false,true)
11 //多项更新
5、删除语法
1db.foo.remove() //删除所有数据
2db.foo.remove({favorties.cities:“cheyene”}) //根据条件进行删除
3db.drop() //删除整个集合
6、索引相关语法
1db.numbers.ensureIndex({num:1})
2//创建一个升序索引
3db.numbers.getIndexes()
4//获取全部索引
7、基本管理语法
1 show dbs
2 //查询所有数据库
3 show collections
4 //显示所有表
5 db.stats()
6 //显示数据库状态信息
7 db.numbers.stats()
8 //显示集合表状态信息
9 db,shutdownServer()
10 //停止数据库
11 db.help()
12 //获取数据库操作命令
13 db.foo.help()
14 //获取表操作命令
15 tab 键 //能自动帮我们补全命令
以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是java驱动去操作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。

7、在Java中使用MongoDB
1、使用maven引入jar包
这里引用的是最新的驱动包,提供了一套新的访问连接方式

1
2 org.mongodb
3 mongodb-driver-sync
4 3.8.0-beta3
5
2、创建一个访问客户端
1 MongoClient client = MongoClients.create(“mongodb://10.201.76.94:27017”);
3、获取集合数量
1 public long count() {
2 MongoClient client = this.getClient();
3 MongoCollection collections= client.getDatabase(“mongodb_db_name”).getCollection(“mongodb_collection_name”);
4 return collections.count();
5 }
4、查询集合
1public List find(Document params,Bson sort,int skip,int limit) {
2 MongoClient client = this.getClient();
3 MongoCollection collections= client.getDatabase(“mongodb_db_name”).getCollection(“mongodb_collection_name”);
4 List list = new ArrayList(Integer.valueOf(config.getPro(“sync_limit”)));
5 collections.find(params).sort(sort).skip(skip).limit(limit).forEach(new Block() {
6 @Override
7 public void apply(Document document) {
8 list.add(document);
9 }
10 });
11 return list;
12 }
这里只举例了简单的链接与简单的MongoDB操作,可见其操作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。

插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。

原文地址:
https://zhuanlan.zhihu.com/p/59753955

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调用父类方法

1.用inherited;调用父类的构造函数;2.用inherited 函数名() 调用父类同名非构造函数;转载于:https://www.cnblogs.com/spiritofcloud/p/3898360.html

ajax上传文件到servlet

js $(function() {// js判断文件大小function findSize(field_id) {let fileInput $("#"field_id)[0];let byteSize fileInput.files[0].size;return ( Math.ceil(byteSize / 1024 / 1024) ); // Size returned in MB.}// 上传图片按钮 <button type"but…

DHCP中继

拓扑如下&#xff1a; R0配置&#xff1a; (config)#ip dhcp pool aaa (dhcp-config)#network 8.8.8.0 255.255.255.0 (dhcp-config)#default-router 8.8.8.1 (dhcp-config)#dns-server 114.114.114.114(config)#ip dhcp pool bbb (dhcp-config)#network 88.88.88.0 255.255.25…

maven项目,如何导入本地jar包

maven项目导入本地jar包&#xff0c;然后以pom坐标的方式引入项目。为何有这种奇怪的需求&#xff1f; maven 上找不到了对应的jar包了&#xff0c;没有对应的坐标。导入方式 将你本地的项目放入maven仓库&#xff0c;使用maven命令。而不是简单的复制进maven仓库。参数说明&…

标签管理(转载)

转自&#xff1a;http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013762144381812a168659b3dd4610b4229d81de5056cc000 发布一个版本时&#xff0c;我们通常先在版本库中打一个标签&#xff0c;这样&#xff0c;就唯一确定了打标签时刻…

centos7配置jdk1.8环境变量

目录1. Oracle下载linux版本的jdk2. 上传到linux服务器3. 解压4. 编辑环境变量1. Oracle下载linux版本的jdk https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html 2. 上传到linux服务器 使用工具 mobaxterm 上传jdk https://mobaxterm.mobatek…

【iOS开发每日小笔记(二)】gitHub上的开源“瀑布流”使用心得

这篇文章是我的【iOS开发每日小笔记】系列中的一片&#xff0c;记录的是今天在开发工作中遇到的&#xff0c;可以用很短的文章或很小的demo演示解释出来的小心得小技巧。它们可能会给用户体验、代码效率得到一些提升&#xff0c;或是之前自己没有接触过的技术&#xff0c;很开心…

spring mvc 入门DispatcherServlet转发

目录一&#xff0c;配置相关二&#xff0c;java类测试三&#xff0c;测试一&#xff0c;配置相关 maven坐标依赖 <dependencies><!-- spring context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context&…

web音乐播放器+后台歌曲,歌单管理

项目地址 https://github.com/sevenyoungairye/web_music_palyer技术点 - 基于h5, css3, js, bootstarp, jquery,- 后台基于structs1, spring, spring-jdbcTemplate功能 - 用户curd- 歌单curd&#xff0c;为歌单新增&#xff0c;移除歌曲- 上传歌曲&#xff0c;修改歌曲- 查询…

Oracle WorkFlow(工作流)(一)

转载自:http://hi.baidu.com/quce227/item/3dee702c66466a0343634a58 1概述 1.1工作流的概念 Workflow是EBS的基础架构技术之一&#xff0c;系统中大部分流程性的通知和审批控制、账户按规则自动生成都是通过Workflow实现的1.2工作流的目的 1&#xff0e; 在业务流程中发送、提…

spring mvc框架请求注解解析,内部资源视图解析器

请看spring DispatcherServlet入门 目录1. RequestMapping2. InternalResourceViewResolver1. RequestMapping 作用&#xff1a;用于建立请求url和处理请求方法之间的对应关系 位置&#xff1a;类上&#xff0c;请求url的第一级访问目录。此处不写的话&#xff0c;相当于应用的…

boot-1学习

Bootstrap-1学习Bootstrap介绍一. 响应式布局(css3的技术)1. 什么是响应式2. 响应式网页必要的要求3.移动设备的适配 --视口-- 这部分在pc端上没用二.Bootstrap1.起步2.全局cssBootstrap介绍 bootrap简称boot,是一个简洁的,直接的,强悍的,直接的一个框架,这是官方对它的描述.主…

UNIX时间戳及日期的转换与计算

UNIX时间戳是保存日期和时间的一种紧凑简洁的方法&#xff0c;是大多数UNIX系统中保存当前日期和时间的一种方法&#xff0c;也是在大多数计算机语言中表示日期和时间的一种标准格式。以32位整数表示格林威治标准时间&#xff0c;例如&#xff0c;使用证书11230499325表示当前时…

spring mvc响应数据方式

目录1. 页面跳转2. 回写数据ResponseBody注解1. 页面跳转 转发&#xff0c;如果有视图解析器&#xff0c;要写全路径/pages/success.jsp RequestMapping("/save4") public String save4(HttpServletRequest req) {req.setAttribute("key", "value 4…

boot栅格布局

栅格布局 使用boot必须熟练使用的三个知识点,媒体查询, 栅格布局,scss 为什么要使用栅格布局? 项目中做布局的方式 table布局csshtml布局栅格布局简单,容易控制语义正确,渲染效率高简单(类似于table)非常容易控制,渲染效率高,语义正确,支持响应式效率低,语义错误控制比较麻…