MongoDB系列(一):初步理解
一、简介
MongoDB是一款强大、灵活、且易于扩展的通用型数据库
1、易用性
1)MongoDB是一款面向文档的数据库,而不是关系型数据库,因此而有着更好的扩展性。
2)通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系。
3)MongoDB没有预定义模式(predefined schema):文档的键和值不再有固定的类型和大小;这样没有固定的模式,添加或删除字段就变得容易了。
4)使用MongoDB开发时能够进行快速迭代,所以开发进程得以加快。
2、易扩展性
PS:当数据量不断增长,增长到存储极限时,就需要扩展数据库了;数据库的扩展分为纵向扩展和横向扩展:纵向扩展就是使用性能更好的机器,
横向扩展就是使用更多的机器。
1)MongoDB的设计采用横向扩展,它能很容易的在多台服务器之间进行数据分割
2)MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,并将用户的请求路由到正确的机器上。
3、丰富的功能
1)索引
- 支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引
2)存储JavaScript
- 开发人员可以直接在服务端存取JavaScript的函数和值
3)聚合
- 支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化
4)特殊的集合类型
- 支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志。
5)文件存储
- 支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现。
4、卓越的性能
1)MongoDB把尽可能多的内存用作缓存cache,视图为每次查询自动选择正确的索引。
2)只要有可能,数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一。
二、MongoDB基础知识
1、文档是MongoDB的核心概念。文档就是键值对的一个有序集{'msg':'hello','foo':3}。类似于python中的有序字典。
需要注意的是:
#、文档中的键/值对是有序的。
#、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
#、MongoDB区分类型和大小写。
#、MongoDB的文档不能有重复的键。
#、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。 文档键命名规范:
#、键不能含有\ (空字符)。这个字符用来表示键的结尾。
#、.和$有特别的意义,只有在特定环境下才能使用。
#、以下划线"_"开头的键是保留的(不是严格要求的)。
2、集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表
1)集合存在于数据库中,为了管理方便,我们应该将不同格式和类型的数据插到不同的集合,但集合并没有固定的结构,
也就意味着我们完全可以把不同格式和类型的数据插入到同一个集合中。
2)使用“.”组织子集合
比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,
这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系;在MongoDB中,使用子集合来组织数据非常高效,值得推荐。
3)当第一个文档插入时,集合就会被创建。合法的集合名:
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。
3、数据库:在MongoDB中,多个文档组成集合,多个集合可以组成数据库
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串:
#、不能是空字符串("")。
#、不得含有' '(空格)、.、$、/、\和\ (空字符)。
#、应全部小写。
#、最多64字节。 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
#、admin: 从身份认证的角度讲,这是“root”数据库,如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。
再者,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器
#、local: 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中
#、config: MongoDB用于分片设置时,分片信息会存储在config数据库中
4、强调:把数据库名添加到集合名前,得到集合的完全限定名,即命名空间
- 例如:
如果要使用cms数据库中的blog.posts集合,这个集合的命名空间就是
cmd.blog.posts。命名空间的长度不得超过121个字节,且在实际使用中应该小于100个字节
三、基本数据类型
1、在概念上,MongoDB的文档与Javascript的对象相近,因而可以认为它类似于JSON。JSON(http://www.json.org)是一种简单的数据表示方式:
其规范仅用一段文字就能描述清楚(其官网证明了这点),且仅包含六种数据类型。
2、这样有很多好处:易于理解、易于解析、易于记忆。然而因为只有null、布尔、数字、字符串、数字和对象这几种数据类型,
所以JSON的表达能力有一定的局限。
3、虽然JSON具备的这些类型已经具有很强的表现力,但绝大数应用(尤其是在与数据库打交道时)都还需要其他一些重要的类型。
例如,JSON没有日期类型,这使得原本容易的日期处理变得麻烦。另外,JSON只有一种数字类型,无法区分浮点数和整数,更别说区分32位和64位了。
再者JSON无法表示其他一些通用类型,如正则表达式或函数。
4、MongoDB在保留了JSON基本键/值对特性的基础上,添加了其他一些数据类型。在不同的编程语言下,这些类型的确切表示有些许差异。
下面说明了MongoDB支持的其他通用类型,以及如何在文档中使用它们:
#、null:用于表示空或不存在的字段
d={'x':null}
#、布尔型:true和false
d={'x':true,'y':false}
#、数值
d={'x':,'y':3.1415926}
#、字符串
d={'x':'egon'}
#、日期
d={'x':new Date()}
d.x.getHours()
#、正则表达式
d={'pattern':/^egon.*?nb$/i} 正则写在//内,后面的i代表:
i 忽略大小写
m 多行匹配模式
x 忽略非转义的空白字符
s 单行匹配模式 #、数组
d={'x':[,'a','v']} #、内嵌文档
user={'name':'egon','addr':{'country':'China','city':'YT'}}
user.addr.country #、对象id:是一个12字节的ID,是文档的唯一标识,不可变
d={'x':ObjectId()}
5、_id和ObjectId
MongoDB基本知识就这些,下篇讲解curd操作
MongoDB系列(一):初步理解的更多相关文章
- 初步理解require.js模块化编程
初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...
- MongoDB系列(二):C#应用
前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...
- javascript 原型及原型链的初步理解
最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
- Graph Cuts初步理解
一些知识点的初步理解_8(Graph Cuts,ing...) Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立 ...
- MongoDB系列之二(主动复制)
目前我正在进行MongoDB的双机热备方面相关的工作.根据我目前看到的MongoDB方面的材料,MongoDB的实际部署有三种方式,分别是“主动复制”,“副本集”以及“分片副本集”. 首先我们从最简单 ...
- mongodb系列之---副本集配置与说明
在配置副本集之前,我们先来了解一些关于副本集的知识. 1,副本集的原理 副本集的原理与主从很相似,唯一不同的是,在主节点出现故障的时候,主从配置的从服务器不会自动的变为主服务器,而是要通过手动修改配置 ...
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感
关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...
- springBoot(1)---springboot初步理解
springboot初步理解 在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2) ...
- Mysql加锁过程详解(7)-初步理解MySQL的gap锁
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
随机推荐
- essential C++中的一些疑问记录
关于书中P87下列代码中,less<int>的使用,我目前的理解是 less<int> 是一个类型,& it 是对外部参数的引用.但是为何要加上引用,另外 调用该函数时 ...
- 面向对象程序设计(Java) 第1周学习指导及要求
面向对象程序设计(Java)第1周学习指导及要求 (2019.8.30-2019.9.2) 学习目标 了解课程上课方式及老师教学要求,掌握课程学习必要的软件工具: 理解JVM.JRE与JDK等概念 ...
- java 中for循环中断的办法
/* 中断for循环的办法: 1.break ***2.return是结束方法的,不是结束循环的. 3.标签的方法. 格式: 表签名:语句 运行结果:D:\test\day0413>java T ...
- (转)为什么HashMap中链表长度超过8会转换成红黑树
原博地址:https://blog.csdn.net/xingfei_work/article/details/79637878 HashMap在jdk1.8之后引入了红黑树的概念,表示若桶中链表元素 ...
- 在eclipse中引入mybatis和spring的约束文件
eclipse中引入mybatis约束文件步骤: 首先: config的key值 http://mybatis.org/dtd/mybatis-3-config.dtd mapper的key值 htt ...
- centos7安装mongodb以及使用
https://blog.csdn.net/sun007700/article/details/100671570
- ios打包时候提示三方文件库错误,整理下解决的思路
这一短时间一直在打包APP上线,今天突然打包的时候碰到的头文件找不到 一开始我以为是路径的问题,检查了targets---Build settings----search Paths----heade ...
- 章节十六、9-Listeners监听器
一.IInokedMethodListener 1.实现一个类来监听testcase的运行情况. package listenerspackage; import org.testng.IInvoke ...
- Cookie的有效路径
程序实现: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletE ...
- C# 缓存的实现
缓存的实现 我们不是做第三方比如Redis等的缓存实现,而是根据实际情况,基于C#上做一些环境变量的保存,方便项目使用. 1.系统全局变量 很多时候,在系统运行开始,需要对系统的运行参数进行保存,以便 ...