文档章节

聊聊MongoDB(一)MongoDB3.4基础介绍

你我他有个梦
 你我他有个梦
发布于 2017/02/23 15:17
字数 3037
阅读 1192
收藏 2

1.    介绍

        MongoDB是一个开源的文档类型数据库,提供高性能、高可用、自动伸缩的特性。灵活的文档模型非常适合敏捷式开发高可用和水平扩展的大数据应用。由C++语言编写,2009年发布第一个版本0.9,已诞生7年,注重CAP定理中的CP,也就是一致性和分区容错性。Mongo进入3.0之后,性能相较于2.6版本有了较大幅度的提升。MongoDB在NoSQL领域占据第一的宝座。由于MongoDB出现的时间并不长,许多功能还存在发展的空间。

可以关注中文社区实时了解其功能改进:http://www.mongoing.com/

MongoDB的文档类似于JSON对象,字段的值可能包括其他文档、数组和文档数组。

优势:

l  文档(即对象)对应于许多编程语言的本地数据类型。

l  嵌入式文档和数组减少了昂贵的连接(适合子文档或者引用数量不大的情况下)。

l  动态模式支持流式多态性(在相同集合的文档不需要具有相同的字段,可以容纳不同的数据类型),动态插入,随意组合的数据类型。

技术特色:

l  灵活的文档模型

l  Replica Set高可用

l  Sharding水平扩展

l  二级索引、动态查询

l  全文搜索

l  聚合框架、MapReduce

l  GridFS

l  地理位置索引 和地理分布查询

l  内存引擎

1.1     Key的特性

1.1.1      高性能

MongoDB提供了高性能的数据持久化。特点:

l  支持嵌入式数据模式(内嵌文档等)降低数据库系统的I/O活动。可以做时间序列数据的分桶优化。所谓分桶优化,就是与其对每一条数据创建一个文档,我们可以利用MongoDB提供的内嵌式数组或子文档特性把某一个时间段内的测量数据聚合到一起放到一个文档内。例如我们把16:00开始一个小时内每分钟采集的油量数据聚合到一个具有60个字段的子文档内。每个字段表示一个分钟采集点。

l  索引支持更快的查询,并可以包括来自嵌入式文档和数组的键。索引支持非常丰富,如常见的单一索引、复合索引、唯一索引,稀疏索引(与唯一索引不同的是不需要将每个文档作为索引条目,比如说,这里我们建了个location的稀疏索引,这个索引会忽略所有文档没有这个location字段的,只对有location值的文档建立索引,这样做可以避免浪费宝贵的资源),特殊的索引如TTL索引(具有生命周期的索引)、全文本索引(搜索文本)、地理空间索引(2dsphere索引用于地球表面类型的地图、2d索引用于平面或者游戏地图和时间连续的数据)、使用GridFS存储文件(是MongoDB用于存储大型二进制文件的一种机制。它使用两个数据结构来存储数据:files包含元数据对象、chunks包含其他一些相关信息的二进制块。GridFS结合自动分片及自动复制技术,可以实现高性能的分布式数据库集群架构,从而进行海量数据存储)等。

1.1.2      丰富的查询语言

MongoDB支持丰富的查询语言而支持读写操作(CRUD)以及:

l  数据聚合,用户通过简单的片段创建复杂的聚合并通过数据库自动优化,用于对一连串的文档进行处理。这些构件包括筛选(filtering)、投射(projecting)、分组(grouping)、排序(sorting)、限制(limiting)和跳过(skipping)。使用MapReduce(javascript为查询语言)解决一些复杂的问题,步骤为map(产生键值)->shuffle(数据洗牌)->reduce(数据化简),所以会有一定的延时,适合批处理计算而不适合在实时的数据分析中使用。

l  文本搜索和地理空间查询。关于LBS相关项目(位置服务),一般会存储每个地点的经纬度的坐标,如果要查询附近的场所,则需要建立索引来提升查询效率,MongoDB专门针对这种查询建立了地理空间索引。

1.1.3      高可用

MongoDB的复制工具称为副本集,提供自动故障转移和数据冗余。

副本集是一组MongoDB服务器保持相同的数据集,提供冗余,提供了数据的可用性。

1.1.4      横向扩展

MongoDB提供的横向扩展作为核心功能的一部分:

l  分片的数据分布在集群中的机器当中。能够很容易的在多台服务器之间进行数据分割,能自动处理跨集群的数据和负载,自动重新分配文档,添加一台新的服务器MongoDB就会自动将现有数据向服务器传送。

l  标签引导数据分片可以掌握具体的分片(如shard00001,shard00002),如可以考虑地理空间的分片。

 

1.1.5      MongoDB支持多存储引擎

l  WiredTiger存储引擎(3.2版本之后默认的存储引擎)。

l  MMAPv1存储引擎(3.2版本之前默认的存储引擎)。

l  In-Memory存储引擎(数据存储在内存中)。

WiredTiger和MMAPv1两种引擎可以互相切换,可以在创建服务的时候指定。在3.0版本以前只支持MMAPv1存储引擎,3.0版本之后发布了WiredTiger存储引擎。功能比MMAPv1更强大。

WiredTiger实现了文档级别的并发控制(同一个集合中可以并发修改不同文档)、检查点(60s创建一次,主要用途是还原数据)、预先记录日志、数据压缩(块算法压缩collections、前缀算法压缩Indexes)和本地数据加密等功能。2.6版本使用的悲观锁(库级锁),在更改之前就将对象锁住(正在访问它会认为你企图修改),导致加锁时间非常长,并发操作非常一般。而3.0版本中,Mongo是采用了乐观锁,乐观锁直到准备提交所做的更改时才将对象锁住,可实现高并发。

此外,MongoDB提供了可插拔式的存储引擎,如可允许第三方开发的存储引擎。

1.2     数据库和集合

MongoDB存储BSON文档,即数据记录在集合中。

 

1.2.1      数据库

在MongoDB中,数据库保存文档的集合。选择用哪个数据库的shell:

use myDB

创建一个数据库:

如果数据库不存在,当你为数据库第一次存储数据时,会创建数据库,切换到一个不存在的数据库执行mongo shell:

use myNewDB

db.col.insert({x:1})

insert的操作会创建myNewDB数据库和col集合。

1.2.2      集合

MongoDB在集合中存储文档。集合类似于关系数据库中的表。

创建集合:

db.col.insert({x:2})

显示创建:

db.createCollection()

文档验证:

默认情况下,集合不要求其稳定具有相同的模式,在一个单独集合中的文档不需要有相同的字段集,并且字段的数据类型可以不同。

但是从Mongo3.2开始,你可以在更新和插入操作时执行集合的文档验证规则。查看详细信息

l  修改文档结构:

比如增加新的字段,删除已存在的字段,或者改变字段值到新的类型,更新文档到新结构。

1.2.3      固定集合(capped collections)

Capped collections 就是固定大小的collection。它有很高的性能以及队列过期的特性(过期按照插入的顺序)。如果向一个满了的固定集合中插入数据,最老的文档将会被删除来释放空间,新插入的文档会占据这块空间,数据被顺序的写入到磁盘。

示例:

db.createCollection("cappedCol",{"capped":true,"size":10000,"max":1000});

db.cappedCol.insert({"name":"zs1","name1":"wangwu"});


db.cappedCol.update(   

{    "name":"zs1"    },    {    $set:{"name":"lisi","name1":"wanwu"}    });

在以上示例中,创建了一个10000字节的集合,且集合中最多有1000个文档,现插入一条数据,要想修改name:zs1的这条数据,在整个文档中,大小必须固定,如果只看value值,zs1+wangwu是9个字节,修改的时候value值大小只能为9字节,不可修改小于或大于该字节数。否则就抛异常:
 

WriteResult(

{

    "nMatched": 0,

    "nUpserted": 0,

    "nModified": 0,

    "writeError": {

        "code": 10003,

        "errmsg": "Cannot change the size of a document in a capped collection: 54 != 52"

    }

})

Capped collections会高性能的自动维护对象的插入顺序。它非常适合类似记录日志的功能。

详细可查看官网或者这篇博文:

http://xiayuanfeng.iteye.com/blog/989024

1.3     文档

MongoDB存储数据是用BSON文档记录,BSON是JSON文件的二进制表示。比JSON包含更多的数据类型。

1.3.1      文档结构

字段-属性

字段值可以是任意的BSON数据类型,包括其他文档,数组和文档中的数组,例如:

l  _id字段值是对象ObjecyID。

l  name包含嵌入式文档。

l  birth和death值是Date数据类型。

l  contribs值是string类型的数组。

l  view值是NumberLong类型。

1.3.2      字段的局限性

字段名称的限制:

l  字段名_id是用于主键;在集合中它的值必须是唯一的、不可变的,并且可能是数组外的任何类型。

l  字段名称不能以$符号开头。

l  不能包含.符号。

l   不能包含null字符。

字段值的限制:

对于索引集合,索引字段的值有一个最大索引键长度的限制,必须小于1KB。详细请查看

https://docs.mongodb.com/manual/reference/limits/#Index-Key-Limit

1.3.3      点符号

数组:

MongoDB使用点符号来访问数组中的元素和访问一个嵌入式的字段。(<array>.<index>),例如

{

   ...

   contribs: [ "Turing machine", "Turing test", "Turingery" ],

   ...

}

使用contribs.2访问到Turing test元素。

嵌入式文档:

{

   ...

   name: { first: "Alan", last: "Turing" },

   contact: { phone: { type: "cell", number: "111-222-3333" } },

   ...

}

使用<嵌入式文档>.<字段>,例如name.last或者contact.phone.number。

1.3.4      文档的局限性

文档大小限制:

最大的BSON文档限制16M。

文档的字段顺序:

l  _id字段必须是在文档的第一个字段。

l  更新包括重命名字段可能会导致文件中的字段排序。

从2.6版本开始,MongoDB正在积极尝试在文档中保存字段的顺序。

_id字段有以下行为和约束:

l  默认情况下,MongoDB创建集合期间在_id字段上创建一个唯一的索引。

l  _id字段如果不是第一个,在服务器接收的文档中第一个没有_id字段,服务器将会移动字段到第一个位置。

l  _id字段除数组以外,可能含有任意的BSON数据类型。

1.4     BSON类型

BSON支持下列数据类型值的文件。每个数据类型都有相应的数字和字符串的别名,可以使用$type操作查询BSON 文档。

Type

Number

Alias

Notes

Double

1

“double”

 

String

2

“string”

 

Object

3

“object”

 

Array

4

“array”

 

Binary data

5

“binData”

 

Undefined

6

“undefined”

Deprecated.

ObjectId

7

“objectId”

 

Boolean

8

“bool”

 

Date

9

“date”

 

Null

10

“null”

 

Regular Expression

11

“regex”

 

DBPointer

12

“dbPointer”

Deprecated.

JavaScript

13

“javascript”

 

Symbol

14

“symbol”

Deprecated.

JavaScript (with scope)

15

“javascriptWithScope”

 

32-bit integer

16

“int”

 

Timestamp

17

“timestamp”

 

64-bit integer

18

“long”

 

Min key

-1

“minKey”

 

Max key

127

“maxKey”

 

1.5     MongoDB扩展JSON

增加以下扩展:

l  严谨模式. BSON类型的严谨模式表示符合RFC的JSON。任何JSON解析器可以解析这些严谨模式表示键/值对的;然而,只有MongoDB内部JSON解析器可以识别这种格式传送的信息类型。

l  mongo  shell模式,MongoDB内部JSON解析器和Mongo shell可以解析这个模式。

详细说明请参考官网:

https://docs.mongodb.com/manual/reference/mongodb-extended-json/

© 著作权归作者所有

你我他有个梦

你我他有个梦

粉丝 96
博文 130
码字总数 109764
作品 0
通州
程序员
私信 提问
Centos7.4+Mongodb安装教程

Centos7.4+Mongodb安装教程 2017年10月27日 11:52:29 poldpai 阅读数:769 标签: mongodb3-4图文教程 更多 个人分类: 软件安装界面运维环境变量 下载mongodb3.4安装包 http://download.cs...

linjin200
2018/12/05
37
0
centos7安装MongoDB3.4

centos7安装MongoDB3.4 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,...

linjin200
2018/12/05
14
0
centos7.3yum安装mongodb3.4

最小化安装centos7.3 服务器规划(说明: 配置静态IP请查看关于上篇环境配置的博客) 安装mongodb3.x 创建yum源 修改yum源 安装MongoDB软件包和相关工具 网速较慢, 比较耗时, 推荐tar包安装, 下...

paascloud
2017/09/07
0
0
CentOS7下使用yum安装Mongodb3.4

1.创建mongodb3.4的yum源文件 在yum源文件目录中创建mongodb-org-3.4.repo 写入仓库文件 2.验证yum源文件是否有效 查看mongodb所需安装文件 3.安装mongodb所需包 MongoDB提供的官方安装文件包...

hengbao5
2018/08/07
34
0
mongodb安装、连接,mongodb用户管理、创建集合、数据管理、备份恢复,副本集介绍、搭建、测试,分片介绍、搭建、测试,php的mongodb扩展、mongo扩展

21.26 mongodb介绍 21.27 mongodb安装 21.28 连接mongodb 21.29 mongodb用户管理 21.30 mongodb创建集合、数据管理 21.31 php的mongodb扩展 21.32 php的mongo扩展 21.33 mongodb副本集介绍 ...

tobej
07/16
77
0

没有更多内容

加载失败,请刷新页面

加载更多

JVM -- Java堆结构及对象分代

Hello,今天记录下 Java虚拟机中的其中一个重点知识 --> Java堆。 一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,...

猫狗熊
14分钟前
1
0
elastic-job的使用

概述: 公司用了elastic-job来执行定时任务和管理定时任务,所以最近研究了一下写了个demo,由于我是把zookeeper部署在了docker上的,所以这里简单介绍下docke的基础命令。 1、Docker基础命令...

你个小机灵鬼
15分钟前
3
0
Cadence Allegro 中skill应用教程:让代码替我们打工

SKILL语言是Candence提供给用户的一个开发接口,利用其本身提供的接口函数和SKILL语言完成自动化操作的功能。 怎么查看SKILL: 1.可以直接用写字板打开进行编辑或看功能说明。 2.想自己写或改...

demyar
16分钟前
2
0
如何看待技术债务

关于技术债务,做开发的同学对如下场景应该不陌生: 为了敢项目进度,详细设计、单元测试等过程就不写了,以后补 需求变化万千,原本架构设计无法满足新的需求,可是又不想动架构,于是绕过架...

嘿嘿嘿IT
18分钟前
2
0
深入理解 web 协议(一)- http 包体传输

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/WlT8070LlrnSODFRDwZsUQ 作者:吴越 开坑这个系列的原因,主要是在大前端学习的过程中遇到了不少跟web协议有关的问...

vivo互联网技术
18分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部