MongoDB基本概念

更新时间:2023-12-30 02:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MongoDB基本概念

MongoDB是面向集合的文档式数据库,不像关系数据库那样,有表,列、行,MongoDB数据库则是由一系列的文档组成。以下介绍MongoDB的基本概念

1 文档

文档是MongoDB数据库的最小集合单位,其基本概念为:由多个键及其关联的值有序组合在一起的集合单元。

如{“One”:3,”Two”:”Hello,MongoDB”}

从概念可以分析得,由多个键,即可说明文档的组成类似于hash表,每个键对应一个记录值,事实上,可以将文档看成关系数据库中的行,每个键值组合可以看成是这个行中对应的列,键表示列的名称,值则为表列值。

文档的值不仅可以是字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。文档的键是字符串,除了少数例外情况,键可以是任意UTF-8字符。

文档定义有如下要求:

1. 键不能含有\\0(空字符),在MongoDB中,这个字符用来表示的结尾 2. .和$有特别含义,在特定环境中使用,使用这两个字符时。需考虑清楚。 3. 以下划线“_”开头的键也是系统保留字符。使用时需要考虑清楚 4. 键是区分大小写的,如{“One”:”Hello”,”one’:”hello”},则表示不同的键

5. 在同一个文档中,不能有相同名称的键。即大小写都相同的键,如下面的文档是非

法的:

{“one”:”hello”,”one”:”helloworld”} 6. 文档中的键值的类型可以不一样的,如:

{“one”:1,”two”:”helloworld”,”three”:0.21}

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

7. 文档中的键/值对是有序的,下面两个文档是完全不同的:

{“One”:3,”Two”:”Hello,MongoDB”} {”Two”:”Hello,MongoDB” , “One”:3} 通常文档中的顺序并不重要。

2 集合

集合即是一组文档,如果说文档类似于行的话。则集合则相当于表。

在MongoDB中,集合是无模式的,即一个集合中的文档可以各式各样的。在集合中,不同的文档的键值数目可以不一样,其中的键也可以不一样。不同文档同一个键,其值可以不一样,类型也可不一样。也即在同一个集合中,文档是相互独立的。

由于集合没有模式,而在实际使用中,可能会造成困扰,因为既然没有什么模式,集合的文档可以是任意的,那么就没必要要多个集合了。比如,我们建立一个博客数据库,在一个集合中可以保存博客文章、文章类别、登录用户等数据。当然,这样把各种各样文档都混在一个集合里,无论对于开发还是管理都非常麻烦。在实际应用中,怎么运用还得看情况而定。

集合命令的规范。集合名可以是满足下列条件的任意UTF-8字符串:

1. 集合名不是能是空字符串;

2. 集合名不能含有\\0字符(空字符),MongoDB中此字符表示集合名的结尾; 3. 集合名不能以”system.”开头,因为此前缀是系统本身保留的前缀,如

system.uses表示系统用户信息,system.namespaces保存所有数据库集合的信息; 4. 集合名称不能有$字符。

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

3 子集合

子集合可以看成是一个命名,如blog.users,blog.author,在这里,blog本身可以不是集合,还可以不存在。使用子集合是为了更好更有条理的区分集合。

4 数据库

多个集合组成数据库。一个MongoDB实例中可以有多个数据库,每个数据库都是完全独立的,有自己的用户,权限信息,即便在磁盘上,其存储的文件也是分开的,这和SQL server之类的数据库一样。不同数据库其数据库文件可以存放在不同的目录。数据库命名规则如下:

1. 不能是空字符串;

2. 不得含有’’(空格)、.、$、/、\\、和\\0(空字符); 3. 应全部小写; 4. 最多64个字节。

除外,数据库名不能与现有系统保留库同名,如admin,local,及config。

数据库命名空间:数据库命名空间,是把数据库名称放在集合前面所得到的所有字符串信息。即为命名空间。如blog.article.author。命令空间的长度在实际运用中不能超过100个字符。

5 数据类型

MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期、32位数字、64位数字等类型。以下对MongoDB的类型进行简要说明:

1. null

null类型用于表示空值或不存在的字段,如:{“one”:null}。

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

2. 布尔类型

布尔类型有两个值,’true’和’false’ ,如:{“one”:true}。

3. 32位整数

在由于MongoDB的控制台使用JS引擎进行输入,而JS仅支持64位浮点数,所以32位整数将会被自动转义;

4. 64位整数

64位整数与32位整数一样,在MongoDB控制台使用时,会转义成64位浮点数。除外,如果数据库本身存储的数据类型无论是32位整数还是64位整数,使用MongoDB控制台获取后,更改其文档记录(即使没有修改整数本身,只修改了文档的其他部分),并重新使用控制台写回数据库,则其数据类型也会变成了64位浮点数。

除外,使用控制台查看一个64位整数时,可能会不正确定,原因是有些64位的整数不能精确表示为64位浮点数,而控制台呈示都是64位浮点数。

5. 64位浮点数

MongoDB控制台数字的默认类型,如:{“one”:2.02} {“one”:10}。

6. 字符串

UTF-8字符串都可以表示为字符串类型的数据,如:{“one”:”Hello World”}。

7. 符号

在MongoDB控制台中不支持这种类型,将自动转义成字符串;

8. 对象id

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

对象id是文档中唯一的12位的ID ,在MongoDB来存储文档时,必须有一个“_id”键,这个键可以是任何类型,如果在增加文档时,没有这个_id键,则系统会使用ObjectId对象自动生成一个,在分布式环境中,不同的机器都能用全局唯一的同种方法来生成值,其生成规则为:

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 时间戳 | 机器 | PID | 计数器

前4位表示时间戳,时间戳以秒为单位,由于时间戳在前面,可以更好地反映出数据插入时的时间顺序,使的数据更容易查询,建立索引更加容易。 接下来的3字节是所在主机的唯一标识符,以确保不同的主机生成不同的ObjectId,不产生冲突。接下来两字节来自产生ObjectId的进程标识符(PID),以确保同一台机器上并发的多个进程产生的ObjectId是唯一的。最后3个字节是一个自动增加的计数器,确保相同进程同一秒产生的ObjectId也是不一样的。

虽然系统会自动创建_id键,但在高并发的应用下建议使用客户端的驱动程序来创建,主要原因是,尽管ObjectId可以生成,但是系统在生成时,还是会产生开销,增加数据库的负担。

9. 日期

日期类型是从标准纪元(公元1年)开始的始的毫秒数,不存储时区,如:{“one”:new Date()} ,注意,如果只使用Date()(没有new),则使用了JS本身自带的时间类型,包含了时区,如果在相同结构的文档使用了不一样的时间值,则可能会造成数据管理上不一致。

10. Timestamp类型

Timestamp类型从1.8版本开始支持,Timestamp有一个特殊的用法:timestamp类型的字段必须是位于文档的前两位。看下面例子:

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

11. 正则表达式

文档键值可以包含正则表达式,其正则表达式采用JS语法来表示,如:{“one”:/ho/i}

12. 代码

文档中可以包含JS代码 如:{“one”:function(){}}

13. 二进制数据

可以由任意字节的串组成,在MongoDB控制台中不能呈示。

14. 最大值

BSON包括一个特殊类型,表示可能的最大值。在MongoDB控制台中不能呈示。

15. 最小值

BSON包括一个特殊类型,表示可能的最小值。在MongoDB控制台中不能呈示。

16. 未定义

文档中也可以使用未定义类型,如{“x”:undefined}。

17. 数组

文档中的值可以表示为数组,但数组并没有严格控制数据内成员的类型,数组内成员其类型可以完全不一样,而且,在数组内还可以嵌套数组。

18. 内嵌文档

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

内嵌文档是将另一个文档当成这个文档中某个键的值。这样似乎更合理的体现了数据的关系,如我们要表示某个博客文章及其作者,在关系型数据库中,我们一般要建立两个表,一个表示表示博客文章(article),另一个则表示博客的作者(author),然后建立外键关系来控制,而在MongoDB中也可以这样表示 :

{“_id”: ObjectId(\

Test”,”article”:{“name”:wangXiao,”fullname”:”wangxiaolin”},”Content”:”Blos test”}

同样,我们也可将其设计成:

{“_id”: ObjectId(\ObjectId(\

{“_id”: ObjectId(\

分成两个文档来表示。而更好的是将其分成两个集合,一个是文章(article),一个是作者(author)。

虽然将文档加上子文档会更好体现数据间的关系,在查询时更容易查询到数据相关联的信息,但会造成数据冗余,不利于数据管理。当然,采用不同的设计方式,还需依使用场景来决定。

6 MongoDB shell

MongoDB自带一个JavaScript shell,通过它可以执行管理操作、检查运行实例,亦或做其他尝试。

6.1 运行shell

运行mongo启动shell:

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

Shell会在启动时自动连接MongoDB服务器,所以要确保在使用shell之前启动mongod。

6.2 MongoDB shell功能

Shell是功能完备的JavaScript解释器,可以运行任何JavaScript程序。

?

可以进行数学运算

?

可以使用标准的javascript库

注意:MongoDB中存储的时间是标准时间UTC +0:00 而咱们中国的时区是+8:00 。在C#中取回DateTime数据时候要转换成LocalTime格式,不然总会缺少8小时。

?

甚至可以定义javascript函数

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

6.3 MongoDB客户端

能够执行JavaScript确实很酷,但shell的真正威力还在于它是一个独立的MongoDB客户端。开启的时候,shell会连接到MongoDB服务器的test数据库,并将这个数据库连接赋值给全局变量db。这个变量是通过shell访问MongoDB的主要入口点。

shell还有些非JavaScript语法的扩展,是为了方便习惯于SQL shell的用户而添加的。

?

使用use命名切换数据库

可以通过db变量来访问其中的集合。例如db.baz返回当前数据库的baz集合。既然现在可以在shell中访问集合,那么基本上就可以执行几乎所有的数据库操作了。

?

使用insert函数向集合插入文档。

先创建一个本地变量叫post。

然后把它插入到叫blog的集合里边去。

然后我们可以用find函数看看blog里边的内容。

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

里边自动加了个叫\的key。

?

find返回集合里的所有文档,如果只想查看一个使用findone

? 使用update来更新文档

update函数要有至少两个参数,第一个是条件,第二个是新的文档。 先给post变量加一个叫comments的key,给它一个空数组做value。

执行更新,替换掉title是“My Blog Post”的那个文档

?

使用remove删除文档

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

现在blog集合就又空了。

江苏国泰国际集团新技术有限公司 http://www.epoint.com.cn Tel:0512-58282433

本文来源:https://www.bwwdw.com/article/el4x.html

Top