第7章 MongoDB 概念解析教程

第7章 MongoDB 概念解析教程

不管咱们学习什么database都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、database,下面咱们挨个介绍。

下表将帮助青天大老爷更容易理解Mongo中的一些概念:

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabasedatabase
tablecollectiondatabase表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins 表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

通过实例,咱们也可以更直观的了解Mongo中的一些概念:


database

一个mongodb中可以建立多个database。

MongoDB的默认database为"db",该database存储在data目录中。

MongoDB的单个实例可以容纳多个独立的database,每一个都有自己的集合和权限,不同的database也放置在不同的文件中。

“show dbs” 命令可以显示所有数据的列表。


    $ ./mongo
    MongoDB shell version: 3.0.6
    connecting to: test
    > show dbs
    local  0.078GB
    test   0.078GB
    >

执行 “db” 命令可以显示当前database对象或集合。


    $ ./mongo
    MongoDB shell version: 3.0.6
    connecting to: test
    > db
    test
    >

运行"use"命令,可以连接到一个指定的database。


    > use local
    switched to db local
    > db
    local
    >

以上实例命令中,“local” 是仁兄要链接的database。

在下一个章节咱们将详细讲解MongoDB中命令的使用。

database也通过名字来标识。database name可以是满足以下条件的任意UTF-8字符串。

  • 不能是空字符串(“”)。
  • 不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
  • 应全部小写。
  • 最多64字节。

有一些database name是保留的,可以直接访问这些有特殊作用的database。

  • admin: 从权限的角度来看,这是"root"database。要是将一个用户添加到这个database,这个用户自动继承所有database的权限。一些特定的server 端命令也只能从这个database运行,比如列出所有的database或者关闭server 。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台server 的任意集合
  • config: 当Mongo用于分片设置时,configdatabase在内部使用,用于保存分片的相关信息。

文档(Document)

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型database有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的文档例子如下:


    {"site":"blog.csdn.net/qq441540598", "name":"liulianjiangcsdn教程"}

下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMSMongoDB
databasedatabase
表格集合
文档
字段
表联合嵌入文档
主键主键 (MongoDB 提供了 key 为 _id )
database服务和客户端
Mysqld/Oraclemongod
mysql/sqlplusmongo

需要注意的是:

  1. 文档中的键/值对是有序的。
  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  3. MongoDB区分类型和大小写。
  4. MongoDB的文档不能有重复的键。
  5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
  • .和$有特别的意义,只有在特定环境下才能使用。
  • 以下划线"_"开头的键是保留的(不是严格要求的)。

集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系database管理系统:Relational Database Management System)中的表格。

集合存在于database中,集合没有固定的结构,这意味着仁兄在对集合可以插入不同格式和类型的数据,但通常情况下咱们插入集合的数据都会有一定的关联性。

比如,咱们可以将以下不同数据结构的文档插入到集合中:


    {"site":"www.baidu.net"}
    {"site":"www.google.net","name":"Google"}
    {"site":"blog.csdn.net/qq441540598","name":"liulianjiangcsdn教程","num":5}

当第一个文档插入时,集合就会被创建。

合法的集合名

  • 集合名不能是空字符串""。
  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不能以"system."开头,这是为系统集合保留的前缀。
  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非仁兄要访问这种系统创建的集合,否则千万不要在名字里出现$。

如下实例:


    db.col.findOne()

capped collections

Capped collections 就是固定大小的collection。

它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 “RRD” 概念类似。

Capped collections 是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能和标准的 collection 不同,仁兄必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。collection 的数据存储空间值提前分配的。

Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当咱们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。

由于 Capped collection 是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB 的操作日志文件 oplog.rs 就是利用 Capped Collection 来实现的。

要注意的是指定的存储大小包含了database的头信息。


    db.createCollection("mycoll", {capped:true, size:100000})

  • 在 capped collection 中,仁兄能添加新的对象。
  • 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
  • 使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。
  • 删除之后,仁兄必须显式的重新创建这个 collection。
  • 在32bit机器中,capped collection 最大存储为 1e9( 1X109)个字节。

元数据

database的信息是存储在集合中。它们使用了系统的命名空间:


    dbname.system.*

在MongoDBdatabase中名字空间 .system.* 是包含多种系统信息的特殊集合(Collection),如下:

集合命名空间描述
dbname.system.namespaces列出所有名字空间。
dbname.system.indexes列出所有索引。
dbname.system.profile包含database概要(profile)信息。
dbname.system.users列出所有可访问database的用户。
dbname.local.sources包含复制对端(slave)的server 信息和状态。

对于修改系统集合中的对象有如下限制。

在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。

{{system.users}}是可修改的。 {{system.profile}}是可删除的。


MongoDB 数据类型

下表为MongoDB中常用的几种数据类型。

数据类型描述
String字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer整型数值。用于存储数值。根据仁兄所采用的server ,可分为 32 位或 64 位。
Boolean布尔值。用于存储布尔值(真/假)。
Double双精度浮点值。用于存储浮点值。
Min/Max keys将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array用于将数组或列表或多个值存储为一个键。
Timestamp时间戳。记录文档修改或添加的具体时间。
Object用于内嵌文档。
Null用于创建空值。
Symbol符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date日期时间。用 UNIX 时间格式来存储当前日期或时间。仁兄可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID对象 ID。用于创建文档的 ID。
Binary Data二进制数据。用于存储二进制数据。
Code代码类型。用于在文档中存储 JavaScript 代码。
Regular expression正则表达式类型。用于存储正则表达式。

下面说明下几种重要的数据类型。

ObjectId

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

  • 前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
  • 接下来的 3 个字节是机器标识码
  • 紧接的两个字节由进程 id 组成 PID
  • 最后三个字节是随机数

MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象

由于 ObjectId 中保存了创建的时间戳,所以仁兄不需要为仁兄的文档保存时间戳字段,仁兄可以通过 getTimestamp 函数来获取文档的创建时间:


    > var newObject = ObjectId()
    > newObject.getTimestamp()
    ISODate("2017-11-25T07:21:10Z")

ObjectId 转为字符串


    > newObject.str
    5a1919e63df83ce79df8b38f

字符串

BSON 字符串都是 UTF-8 编码。

时间戳

BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的 日期 类型不相关。 时间戳值是一个 64 位的值。其中:

  • 前32位是一个 time_t 值(与Unix新纪元相差的秒数)
  • 后32位是在某秒中操作的一个递增的序数

在单个 mongod 实例中,时间戳值通常是唯一的。

在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。

BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,仁兄可以使用 BSON 日期类型。

日期

表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。


    > var mydate1 = new Date()     //格林尼治时间
    > mydate1
    ISODate("2018-03-04T14:58:51.233Z")
    > typeof mydate1
    object


    > var mydate2 = ISODate() //格林尼治时间
    > mydate2
    ISODate("2018-03-04T15:00:45.479Z")
    > typeof mydate2
    object

这样创建的时间是日期类型,可以使用 JS 中的 Date 类型的方法。

return 一个时间类型的字符串:


    > var mydate1str = mydate1.toString()
    > mydate1str
    Sun Mar 04 2018 14:58:51 GMT+0000 (UTC) 
    > typeof mydate1str
    string

或者


    > Date()
    Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)

本专栏所有文章

第1章 MongoDB 教程第2章 NoSQL 简介教程
第3章 MongoDB 简介教程第4章 Windows MongoDB教程
第5章 Linux MongoDB教程第6章 OSX MongoDB教程
第7章 第7章 MongoDB 概念解析教程教程第8章 MongoDB 连接教程
第9章 MongoDB 创建数据库教程第10章 MongoDB 删除数据库教程
第11章 MongoDB 创建集合教程第12章 MongoDB 删除集合教程
第13章 MongoDB 插入文档教程第14章 MongoDB 更新文档教程
第15章 MongoDB 删除文档教程第16章 MongoDB 查询文档教程
第17章 MongoDB 条件操作符教程第18章 MongoDB $type 操作符教程
第19章 MongoDB Limit与Skip方法教程第20章 MongoDB 排序教程
第21章 MongoDB 索引教程第22章 MongoDB 聚合教程
第23章 MongoDB 复制(副本集)教程第24章 MongoDB 分片教程
第25章 MongoDB 备份与恢复教程第26章 MongoDB 监控教程
第27章 MongoDB Java教程第28章 MongoDB PHP 扩展教程
第29章 MongoDB PHP教程第30章 MongoDB PHP7教程
第31章 Node.js MongoDB教程第32章 MongoDB 关系教程
第33章 MongoDB 数据库引用教程第34章 MongoDB 覆盖索引查询教程
第35章 MongoDB 查询分析教程第36章 MongoDB 原子操作教程
第37章 MongoDB 高级索引教程第38章 MongoDB 索引限制教程
第39章 MongoDB ObjectId教程第40章 MongoDB Map Reduce教程
第41章 MongoDB 全文检索教程第42章 MongoDB 正则表达式教程
第43章 MongoDB 管理工具教程第44章 MongoDB GridFS教程
第45章 MongoDB 固定集合教程第46章 MongoDB 自动增长教程

寄语

本文有榴莲酱CSDN原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/qq441540598

  • 人的一生就像爬山,你总以为山顶才是目的,那里的风景才是最好的。
  • 一株小草,也能报春,一滴水珠,也能滋润,一丝风儿,也能送爽,一星之火,也能燎原。我虽渺小,也有价值,相信自己,天生我材必有用。
  • 说穿了,其实提高成绩并不难,就看你是不是肯下功夫积累,多总结。
  • 一个有事业追求的人,能够把梦做得高些。虽然开始时是梦想,但只要不停地做,不轻易放下,梦想能成真。
  • 我在美国前4年是学习,后十几年是工作,所有这一切都在做准备,为了回到祖国后能为人民做点事因为我是中国人。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲酱csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值