赞
踩
MongoDB是面向集合的文档式数据库,不像关系数据库那样,有表,列、行,MongoDB数据库则是由一系列的文档组成。以下介绍MongoDB的基本概念。
文档是MongoDB数据库的最小集合单位,其基本概念为:由多个键及其关联的值有序组合在一起的集合单元。
如{“One”:3, ”Two”:”Hello,MongoDB”}
可以将文档看成关系数据库中的行,每个键/值组合可以看成是这个行中对应的列,键表示列的名称,值则为表列值。
文档的值不仅可以是字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。文档的键是字符串。
文档定义有如下要求:
1. 键不能含有0(空字符),在MongoDB中,这个字符用来表示的结尾
2. .和$有特别含义,在特定环境中使用,使用这两个字符时。需考虑清楚。
3. 以下划线“_”开头的键也是系统保留字符。使用时需要考虑清楚
4. 键是区分大小写的,如{“One”:”Hello”,”one’:”hello”},则表示不同的键
5. 在同一个文档中,不能有相同名称的键。即大小写都相同的键,如下面的文档是非法的:
{“one”:”hello”,”one”:”helloworld”}
6. 文档中的键值的类型可以不一样的,如:
{“one”:1,”two”:”helloworld”,”three”:0.21}
7. 文档中的键/值对是有序的,下面两个文档是完全不同的:
{“One”:3,”Two”:”Hello,MongoDB”}
{”Two”:”Hello,MongoDB” , “One”:3}
集合即是一组文档,如果说文档类似于行的话,则集合则相当于表。
在MongoDB中,集合是无模式的,即一个集合中的文档可以各式各样的。在集合中,不同的文档的键值数目可以不一样,其中的键也可以不一样。不同文档同一个键,其值可以不一样,类型也可不一样。在同一个集合中,文档是相互独立的。
集合命令的规范。集合名可以是满足下列条件的任意UTF-8字符串:
1. 集合名不能是空字符串;
2. 集合名不能含有0字符(空字符),MongoDB中此字符表示集合名的结尾;
3. 集合名不能以”system.”开头,因为此前缀是系统本身保留的前缀,如system.uses表示系统用户信息,system.namespaces保存所有数据库集合的信息;
4. 集合名称不能有$字符。
多个集合组成数据库。一个MongoDB实例中可以有多个数据库,每个数据库都是完全独立的,有自己的用户,权限信息,即便在磁盘上,其存储的文件也是分开的,这和SQL server之类的数据库一样。不同数据库其数据库文件可以存放在不同的目录。数据库命名规则如下:
1. 不能是空字符串;
2. 不得含有’’(空格)、.、$、/、、和0(空字符);
3. 应全部小写;
4. 最多64个字节。
MongoDB的文档使用BSON来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期、时间戳、32位数字、64位数字、符号、对象id、正则表达式、代码、二进制数据、最大最小值、未定义、内嵌文档等类型。以下对MongoDB的一些类型进行简要说明:
1. 对象id
对象id是文档中唯一的12位的ID ,在MongoDB来存储文档时,必须有一个“_id”键,这个键可以是任何类型,如果在增加文档时,没有这个_id键,则系统会使用ObjectId对象自动生成一个。
2. 正则表达式
文档键值可以包含正则表达式,其正则表达式采用JS语法来表示,如:{“one”:/ho/i}
3. 代码
文档中可以包含JS代码 如:{“one”:function(){}}
4. 未定义
文档中也可以使用未定义类型,如{“x”:undefined}。
5. 数组
文档中的值可以表示为数组,但数组并没有严格控制数据内成员的类型,数组内成员其类型可以完全不一样,而且,在数组内还可以嵌套数组。
6. 内嵌文档
内嵌文档是将另一个文档当成这个文档中某个键的值。这样似乎更合理的体现了数据的关系,如我们要表示某个博客文章及其作者,在关系型数据库中,我们一般要建立两个表,一个表示表示博客文章(article),另一个则表示博客的作者(author),然后建立外键关系来控制。而在MongoDB中我们这样表示 :
{“_id”: ObjectId("4e75d586f2723d6f1d886771"),”title”:”blog Test”,
”author”:{“name”:wangXiao,”fullname”:”wangxiaolin”},”Content”:”Blos test”}
同样,我们也可将其设计成:
{“_id”: ObjectId("4e75d586f2723d6f1d886771"),”title”:”blog Test”,”author”:” ObjectId("6e75c586f2723d6f1d886791")”,”Content”:”Blos test”}
{“_id”: ObjectId("6e75c586f2723d6f1d886791") ,“name”:wangXiao,”fullname”:”wangxiaolin”}
分成两个文档来表示。
虽然将文档加上子文档会更好体现数据间的关系,在查询时更容易查询到数据相关联的信息,但会造成数据冗余,不利于数据管理。当然,采用不同的设计方式,还需依使用场景来决定。
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,一起进步
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。