本文默认已经装好了mongodb,在cmd中使用,检测方式为,在一个cmd窗口中输入【mongod】打开服务器端,再打开另一个窗口,输入【mongo】打开可以链接服务端的客户端。
本文主要内容来自于《mongodb权威指南》,pdf地址在文末
如下
简介
-
易于使用
mongodb是一个面向文档的数据库,由于关系型数据库导致的扩展型不强,基于此mongodb有如下不同
- 不再有"行"的概念,以文档取代:文档中可以嵌入多种数据类型,还可以再次在数据类型中嵌入新的数据类型
- 不在有固定模式:key和value不再固定类型和大小,这个value是字符串,下一个value可以是整型
-
易于扩展
随着数据量的成倍增长,数据库也要进行相应扩展
- 纵向扩展,用更多的计算机……
- 横向扩展,在多台计算机中进行数据分割,进而产生切片,复制等新功能(属于进阶功能)
-
功能丰富
MongoDB作为一款通用型数据库,除了能够创建、读取、更新和删除数据之外,还提供一系
列不断扩展的独特功能。- 索引(indexing)
MongoDB支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、
地理空间索引,以及全文索引。 - 聚合(aggregation)
MongoDB支持“聚合管道”(aggregation pipeline)。用户能通过简单的片段创建
复杂的聚合,并通过数据库自动优化。 - 特殊的集合类型
MongoDB支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会
话(session)。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,
如日志。 - 文件存储(file storage)
MongoDB支持一种非常易用的协议,用于存储大文件和文件元数据。
- 索引(indexing)
基础知识
先介绍几个概念
概念 | 解释 |
---|---|
文档 | MongoDB中数据的基本单元,非常类似于关系型数据库管理系统中的行,但更具表现力。 |
集合 | 一个拥有动态模式(dy namic schema)的表,有多个文档组成 |
数据库 | 每一个数据库都拥有自己的集合。 |
实例 | MongoDB的一个实例可以拥有多个相互独立的数据库(database), |
-
文档:键值对的一个有序集
这是mongdb的核心,文档就是键值对的一个有序集,很像json,如
{"greeting" : "Hello, world!"}
就是一个文档,只有一个键greeting,当然,可以有多个键,并且value值任意(json不行)
{"greeting" : "Hello, world!", "foo" : 3}
另外,mongodb区分类型,区分大小写,也不能重复,下面两个文档是不同的
{"foo" : 3} {"foo" : "3"}
下面两个文档也是不同的:
{"foo" : 3} {"Foo" : 3}
-
集合:多个文档就构成了集合
动态模式:就是集合里面的文档是多种多样的,正如
{"greeting" : "Hello, world!", "foo" : 3}
既然文档什么都可以装,那为什么还需要集合呢?
在实践中,并不推荐这种把不同类型的文档放入一个集合的方式
比如一个文档可以有username,age,score等键,那么含有相同键的文档就可以放入一个名为students的集合中,而如果这个集合又放入了其他类型的文档,将会给维护带来很大麻烦。
所以这就是集合的作用——归类作用相同的文档
-
数据库:多个集合组成数据库
一个mongodb实例可以有多个数据库,打开cmd客户端,输入mongo进入的进程就是一个实例
每个数据库都将成为文件系统中的文件,数据库名就是相应的文件名,所以数据库的命名有以下限制
不能是空字符串("")。
不得含有/、\、.、"、*、<、>、:、|、?、$(一个空格)、\0(空字符)。基本
上,只能使用ASCII中的字母和数字。
数据库名区分大小写,即便是在不区分大小写的文件系统中也是如此。简单起
见,数据库名应全部小写。
数据库名最多为64字节。
增删改查实战操作
要进行此项操作,请先确认能进入mongodb数据库
- 创建
insert函数可将一个文档添加到集合中。举一个存储博客文章的例子。首先,创建一个名
为post的局部变量,这是一个JavaScript对象,用于表示我们的文档。它会有几个
键:“title”、“content"和"date”(发布日期)。
>post = {"title" : "My Blog Post",
... "content" : "Here's my blog post.",
... "date" : new Date()}
这个对象是个有效的MongoDB文档,所以可以用insert方法将其保存到blog集合中:
>db.blog.insert(post)
这篇文章已被存到数据库中。若只想查看一个文档,可用findOne
可以看到,我们曾输入的键/值对都已被完整地记录。此外,还有一个额外添加的
键"_id"。
-
读取
find和findOne方法可以用于查询集合里的文档。find可最多输出20个文档
find和findOne可以接受一个查询文档作为限定条件。这样就可以查询符合一定条件的文
档。使用find时,shell会自动显示最多20个匹配的文档,也可获取更多文档。第4章会详细
介绍查询相关的内容。 -
更新
使用update修改博客文章。update接受(至少)两个参数:第一个是限定条件(用于匹
配待更新的文档),第二个是新的文档。假设我们要为先前写的文章增加评论功能,就需要
增加一个新的键,用于保存评论数组。
首先,修改变量post,增加"comments"键:
>post.comments = []
然后执行update操作,用新版本的文档替换标题为“My Blog Post”的文章:
db.blog.update({title : "My Blog Post"}, post)
现在,文档已经有了"comments"键。再用find查看一下,可以看到新的键:
- 删除
使用remove方法可将文档从数据库中永久删除。如果没有使用任何参数,它会将集合内的
所有文档全部删除。它可以接受一个作为限定条件的文档作为参数。例如,下面的命令会删
除刚刚创建的文章:
db.blog.remove({title : "My Blog Post"})
现在,集合又是空的了。