首页 / MONGODB / MongoDB 数据模型
MongoDB 数据模型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MongoDB 数据模型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7324字,纯文字阅读大概需要11分钟。
内容图文
![MongoDB 数据模型](/upload/InfoBanner/zyjiaocheng/500/b94c93537960480dbd00967ffa46b466.jpg)
下表列出了 RDBMS
与 MongoDB
对应的术语:
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | 主键 (MongoDB 提供了 key 为 _id ) |
数据库服务 | 客户端 |
---|---|
Mysqld /Oracle |
mysql /sqlplus |
mongod |
mongo |
需要注意的是:
- 文档中的键/值对是有序的。MongoDB会尽量保持文档被插入时键值对的顺序
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
- MongoDB中写操作的原子性限制在文档级别,对文档的保存、修改、删除 等都是原子操作
- 单个文档占用的存储空间不能超过16MB
关于文档键的命名需要注意以下几点:
- _id是系统保留的关键字,它是默认的主键,该值在集合中必须唯一,且不可更改
- .(命名空间)和$(操作符)有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
- 键不能包含\0或空字符,这个字符用于表示键的结尾
- 键是区分大小写的且不能重复例如:{foo:l,Foo:l}
内嵌文档
文档可以作为键的值,这样的文档称为内嵌文档。内嵌文档可以使数据不用保存成扁平结构的键值对,从而使数据组织方式更加自然。
例如:下面是一个与博客管理有关的文档
{
_id: <Objectldl>,
title: MongoDBDateModeln,
author: foo,
comments:[
{who:"John",comment:"Good"},
{who:"Joe",comment:"ExceUent"}
]
}
上面的文档可以进行如下的拆分:
即拆分成引用文档.
内嵌文档特点
- 子文档比较少时,可以保证原子性,同时具备高速查询;
- 子文档比较多时,会影响查询和更新速度,同时也带来数据冗余
集合
把一组相关的文档放到一起组成了集合,如果将MongoDB的一个文档比喻 为关系型数据库中的一行,那么一个集合就相当于一张表。
MongoDB的集合是模式自由的,一个集合里面的文档可以是各式各样。
例如:下面的两个文档可以出现了同一个集合中。
{"x":1}
{"x":1,"y":2}
{"x":1,"y":2,"z":5}
当第一个文档插入时,集合就会被创建。
MongoDB提供了一些特殊功能的集合,例如:cappedcollection、 system.indexes、system.namespaces 等。
合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有
\0
字符(空字符),这个字符表示集合名的结尾。 - 集合名不能以
system.
开头,这是为系统集合保留的前缀。 - 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$(注:可包含.)
如下实例:
db.col.findOne()
capped collections
Capped collections 就是固定大小的collection。
它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。
Capped collections是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能 和标准的collection不同,你必须要显式的创建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。
要注意的是指定的存储大小包含了数据库的头信息。
db.createCollection("mycoll", {capped:true, size:100000})
- 在capped collection中,你能添加新的对象。
- 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
- 数据库不允许进行删除。使用drop()方法删除collection所有的行。
- 注意: 删除之后,你必须显式的重新创建这个collection。
- 在32bit机器中,capped collection最大存储为1e9( 1X109)个字节。
命名空间
把数据库名添加到集合名字前面,中间用点号连接,得到集合的完全限定 名,就是命名空间,例如:命名空间parent.sub。
需要说明的是,点号还可以出现在集合名字中,例如:parent.subling0,parent.subling2可以将subling0和subling2集合看作是parent集合的子集合。
使用子集合可以使我们更好的组织数据,使数据的结构更加清晰明了。
元数据
数据库的信息是存储在集合中。它们使用了系统的命名空间:
dbname.system.*
在MongoDB数据库中名字空间<dbname>.system.*
是包含多种系统信息的特殊集合(Collection),如下:
集合命名空间 | 描述 |
---|---|
db.system.namespaces |
列出所有名字空间。 |
db.system.indexes |
列出所有索引。 |
db.system.profile |
包含数据库概要(profile)信息。 |
db.system.users |
列出所有可访问数据库的用户。 |
db.local.sources |
包含复制对端(slave)的服务器信息和状态。 |
对于修改系统集合中的对象有如下限制。
在{{system.indexes}}
插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}
是可修改的。 {{system.profile}}
是可删除的。
MongoDB 数据类型
BSON可以理解为在JSON基础上添加了一些新的数据类型,包括Date,正贝IJ 表达式,对数值类型的更进一步划分等。
数据类型 | 类型编号 | 数据类型 | 类型编号 |
---|---|---|---|
Double | 1 | Regular Expression | 11 |
String | 2 | JavaScript | 13 |
Object | 3 | Symbol | 14 |
Array | 4 | JavaScript(Scope) | 15 |
Binarydata | 5 | 32-bit integer | 16 |
Object id | 7 | Timestamp | 17 |
Boolean | 8 | 64-bit integer | 18 |
Date | 9 | Min Key | 255 |
Null | 10 | Max Key | 127 |
可以使用类型编号进行条件查询如下:
db.collection.find({name:{$type:2}})
基本数据类型
null 表示空值或不存在的字段例如:db.collection.find({nyn:null})
- 布尔有两个值true或false 例如:{"y":true}
数值类型支持32-int、64-int以及64-double
注:JavaScript只支持64位浮点数
例如:
- {"y":10} - double
- {"y":Numberlnt(10)} - 32
- {"y":NumberLong(10)} - 64
7 Documents:0 > db.demo.insert({y:10}) WriteResult({ "nInserted" : 1 }) 8 Documents:1 > db.demo.find({y:{$type:1}}) { "_id" : ObjectId("5a7863305640374fb2cd5620"), "y" : 10 } 9 Documents:1 > db.demo.insert({y:NumberInt(10)}) WriteResult({ "nInserted" : 1 }) 10 Documents:2 > db.demo.find({y:{$type:16}}) { "_id" : ObjectId("5a78636d5640374fb2cd5621"), "y" : 10 } 11 Documents:2 > db.demo.insert({y:NumberLong(10)}) WriteResult({ "nInserted" : 1 }) 12 Documents:3 > db.demo.find({y:{$type:18}}) { "_id" : ObjectId("5a7863915640374fb2cd5622"), "y" : NumberLong(10) }
- 字符串使用UTF-8对字符串进行编码例如:{"y":"HelloMongoDB"}
二进制数据可以保存由任意字节组成的字符串,例如:图片、视频等
正则表达式:主要用于查询,使用正则表达式作为限定条件
例如:
- {name:/foo/} name字段含有foo的文档
- {name:/foo/i} name字段含有foo的文档,且不区分大小写
- {name:/^foo/i} name字段以foo幵头,且不区分大小写
JavaScript代码:文档中可以包含任意的JavaScript代码
例如:{"func":function(){}}
Date日期
- MongoDB中,日期类型是一个64位的整数,它代表的是距Unixepoch的毫秒数
- MongoDB在存储时间时,先转化为UTC时间
- 北京时间(CST) = UTC + 8个小时
- MongoDBShell中可以使用newDate或ISODate来创建时间对象,在进行显示时,Shell会根据本地时间去设置显示日期对象
14 Documents:3 > var mydate0 = new Date()
15 Documents:3 > var mydate9 = ISODate()
16 Documents:3 > mydate0
ISODate("2018-02-05T14:04:43.243Z")
17 Documents:3 > mydate9
ISODate("2018-02-05T14:04:57.715Z")
18 Documents:3 > mydate9.toString()
Mon Feb 05 2018 22:04:57 GMT+0800 (CST)
Timestamp
- 时间戳类型有两部分组成:
- Timestmp只供MongoDB数据库服务内部使用,用于记录操作的详细时间
- Timestamp类型和Date类型是没有关系的,对于我们来说使用更多的Date类型
- 相关函数:Timestamp()
Objectld
Objectld由24个十六进制字符构成,每个字节存储两位十六进制数字,总共需 12字节存储空间
每个字节代表的含义如下:
这种方式生成的Objectld在分布式仍然是唯一的.
相关函数:
Objectld()
用于取得Objectld
getTimestamp()
用于取得Objectld的时间戳
valueOf()
用于取得Objectld的字符串表示
19 Documents:3 > x = ObjectId()
ObjectId("5a7866e75640374fb2cd5623")
20 Documents:3 > x.getTimestamp()
ISODate("2018-02-05T14:15:03Z")
21 Documents:3 > x.valueOf()
5a7866e75640374fb2cd5623
数组
数组是使用方括号来表示的一组值,它既可以作为有序对象(列表、栈、队 歹|J),也能作为无序对象(如集合)来操作
数组中可以包含不同数据类型的元素(字符串、浮点数、文档等)
例如:[3.14,"hello",[l2,3],{"key":"MongoDB"}]
针对数组MongoDB提供了许多特定的操作符,例如:
$push
,$pop
,$pull
,$slice
,$addToSet
等MongoDB可自动的为数组元素建立Multikey索引
MongoDB 数据模型
标签:groups als 集合 poc 官方 适合 继承 mongod 是你
本文系统来源:https://www.cnblogs.com/oneTOinf/p/8451389.html
内容总结
以上是互联网集市为您收集整理的MongoDB 数据模型全部内容,希望文章能够帮你解决MongoDB 数据模型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。