MongoDB简介

易于使用

MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库;

MongoDB里的“文档”(document)对应关系性数据库里的“行”(row);

通过在文档里嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层次关系;

不再有预定模式:文档的键(key)和值(value)不再是固定的大小和类型。

易于拓展

纵向拓展就是使用计算能力更强的机器,而横向拓展就是通过分区将数据分散到更多的机器上。通常,纵向拓展是最省力的做法,其缺点是大型机器一般都非常昂贵,而且当数据量达到机器的物理极限时,无论花再多钱也买不到更强的机器了。而横向拓展需要增加存储空间或者提高性能,只需要购买一台普通的服务器并把它添加到集群中就可以了,看起来横向既便宜友容易拓展,不过管理100台机器可显然比管理一台机器要困难得多。

MongoDB的设计采用横向拓展。面向文档的数据模型使它很容易能够在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载自动重新分配文档,以及将用请求路由到正确的机器上。如果有一个集群需要更大的容量,只需要向集群中添加新服务器,MongoDB就会自动将现有的数据向新服务器传送。

丰富的功能

索引(indexing):支持通用二级索引,允许多种快速查询,而且提供唯一索引,符合索引,地理空间索引以及全文索引;

聚合(aggregation):“聚合管道”,用户能够通过简单的片段创建复杂的聚合,并通过数据库自动优化;

特殊的聚合类型:存在时间有限的集合,适用于那些在某些时刻过期的的数据,也支持固定大小的集合,用于保存近期的数据;

文件存储(file storage):支持非常易用的协议,用于存储的大文件和文件元数据。

卓越的性能

MongoDB能够对文档进行动态填充,也能预分配的数据文件以利用额外的空间来换取稳定的性能。MongoDB把尽可能多的内存用作缓存,试图为每次查询自动选择正确的索引。

基础知识

文档是MongoDB中数据的基本单元,类似与关系性数据库中的“行”

集合(collection)可以看作是一个拥有动态模式的表

MongoDB的一个实例可以拥有多个相互独立的数据库,每个数据库都拥有属于自己的集合

每个文档都有一个特殊的键“_id”,这个建在文档所属的集合中是唯一的

MongoDB自带了一个简单但是功能强大的Javascript shell,可用于管理MongoDB的实例或者数据库

  1. 文档

文档就是键值对的一个有序集。每种编程语言表示文档的方法不太一样,但大多数编程语言都有一些相同的数据结构,比如映射(map),散列(hash)或字典(dictionary)。

文档的键是字符串。除了少数情况以外,键可以使用UTF-8字符
键不能使用含\0(空字符)。这个字符用于表示键的结尾
.和$由特殊含义,只能在特定的环境中使用。通常这两个字符是被保留的

MongoDB不去分类型,但是区分大小写

文档中不能存在重复的键

  1. 集合

集合就是一组文档。相当于关系型数据库中的一张“表”。
动态模式

集合是动态模式的。者意味着一个集合里面的文档可以是各种各样的。
将文档按类型区分放在不同的集合的原因:

方便管理
查询特定文档时分开查询速度更快
同类型的文档放在一个集合中,数据会更加集中
可以更加更加有效的创建索引

命名
集合使用名称标识。集合名可以是符合一下标准的任意UTF-8字符串:
不能是空字符串
不能包含\0字符,这个字符表示集合名结束
不能以“system.”开头,这是系统集合保留的前缀
不能包含保留字符 ‘$‘

子集合
组织集合使用一种惯例是“.”分隔不同的z命名空间的子集合。
GridFS(一种用于存储大文件的协议)使用子集合来存储文件的元数据,这样就可以与文件内容块很好的隔离开来
大多数驱动程序都提供了一些语法糖,用于访问制定集合的子集合。

  1. 数据库

多个文档组成集合,多个集合组成数据库。

数据库名规范:
不能是空字符串
字母数字下划线
区分大小写,简单起见最好全部小写
最多为64字节
数据库最终会变成文件系统中的文件,而数据库名就是相应的文件名。

系统保留数据库:
admin:这是“root”数据库。将用户添加到这个数据库,这个用户将获得所有的权限,另外一些特定的服务器端命令只能从admin数据库运行;
local:这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中;
config:用于分片时设置,分片信息存储在这个数据库中。
启动MongoDB

启动:
mongod
默认数据目录:/data/db
端口:27017
mongod还会启动一个非常基本的HTTP服务器,访问 http://localhost:28017 能获取数据库的管理信息

MongoDB shell简介

MongoDB自带一个Javascript shell,可以在shell中使用命令行与MongoDb进行交互。

运行shell
启动:
mongo
此shell是一个功能完备的Javascript解释器,可以运行任意Javascript程序。

  1. MongoDB客户端
    上面启动的这个shell不仅能运行JS程序,而且它是一个独立的MongoDB客户端,启动时shell会连接到MongoDB服务器的test数据库,并将数据库连接赋值给全局变量db,这个变量是通过shell访问MongoDb的主要入口点。

查看db当前指向哪一个数据库:

db
test
为了方便习惯使用SQL shell的用户,shell还包含一些非Javascript语法的拓展。这些拓展并不提供额外的功能,二是一些非常棒的语法糖。如:
选则数据库:
use acmshow
switched to db acmshow
db
acmshow
shell基本操作

创建:insert
查询:find和findOne,find会自动显示最多20个匹配的文档
更新:update,接受两个参数:限定条件和新的文档
删除:remove,接受一个限定参数

  1. 数据类型

基本数据类型

在概念上MongoDB文档和Javascript中的对象相近,因而可以认为它类似于JSON。JSON只有6种数据类型:null,布尔,数字,字符串,数组和对象。然而JSON没有日期类型, 也无法区分浮点数和正整数,更别说区分32位和64位了,再者JSON也无法表示一些通用类型如正则表达式。
MongoDB在保留了JSON的键值对特性的基础上,添加了其他一些数据类型:

null

布尔

数值:默认使用64位浮点型值NumberInt(4字节带符号整数)或者NumberLong(8字符带符号整数)

字符串:所有UTF-8字符串

日期

正则表达式

数组

内嵌文档

对象ID

二进制数据

代码

日期

Date类可以用作MongoDB的日期类型。shell根据本地时区设置显示日期对象,然而数据库中存储的日期仅为新纪元以来的毫秒数,并未存储对应时区。

数组

数组是一组值,它既能作为有序对象(如列表,栈或队列),也能作为无序对象(如数据集)来操作。常规的键/值对支持所有值都可以作为数组的值,数组中甚至可以嵌套数组。
内嵌文档

文旦可以作为键的值,这样的文档就是内嵌文档。使用内嵌文档,可以使数据组织方式更加自然,不用非得存成扁平结构的键值对。
_id和ObjectId

ObjectId是"_id"的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便的生成它。这是MongoDB采用ObjectId,而不是其他比较常规的做法(比如说自动增加主键的原因),因为在多个服务器上同步自动增加主键值费时又费力/。因为设计MongoDB的初衷就是用作分布式数据库,所以能够在分片环境中生成唯一的标识符非常的重要。
使用MongoDB shell

$ mongo some-host:30000/myDB
MongoDB shell version: 2.4.0
connecting to: some-host:30000/myDB

db现在就指向了some-host:30000 上的 myDB 数据库。
帮助:help
执行脚本如 $ mongo test.js 然后mongo会依次执行传入的脚本,然后退出
也可以从交互式shell中执行脚本 > load("script1.js")
在脚本中可以访问db变量以及其他的全局变量
如果某些脚本需要频繁加载,可以将他们添加到mongorc.js文件中,这个文件会在启动shell时自动运行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容