Dawn's Blogs

分享技术 记录成长

0%

MongoDB学习 (1) 基础概念

介绍 MongoDB

MongoDB 是一个由 C++ 编写的,分布式文档型数据库。在高负载的情况下,可以添加更多的节点,可以保证服务器性能。MongoDB 将数据存储为一个文档,数据结构由键值对构成,MongoDB 文档类似于 JSON 对象。字段值可以包含字面量,其他文档,数组及文档数组。

特点

MongoDB 的特点是:

  • 支持索引,利用索引可以实现更快的排序。
  • 支持数据分片和数据复制,也就是具备分布式能力。
  • 支持 Map/Reduce,用于对数据进行批量的处理和聚合操作。
  • 允许在服务器端执行 Javascript 脚本。

概念

在 mongodb 中,最基本的概念就是文档、集合、数据库。

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

数据库

在 MongoDB 中,可以建立多个数据库。show dbs 命令可以显示所有数据的列表,db 命令显示当前连接的数据库,use 命令切换选择数据库。

在 MongoDB 中,一些数据库名是保留的,具有特殊的功能。

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

文档

MongoDB 数据库中的文档是类似于 json 的键值对,所以 MongoDB 被称之为文档型数据库。但是与关系型数据库不同的是,Mongo DB 的文档有以下特性:

  • MongoDB 是无模式的,也就是说,MongoDB 的文档不需要设置相同的字段,甚至不同文档中相同的字段可以设置不同的数据类型。
  • MongoDB 文档之间是不提供表联合的,但是可以在一个文档中嵌入其他的文档,甚至是文档列表。
  • MongoDB 文档的主键为 _id,是 MongoDB 自动生成的。

集合

集合就是 MogoDB 中的文档组,存在于数据库中,集合没有固定的结构。当第一个文档插入时,集合就会被创建。

系统集合的前缀为 system.,所以用户自定义的集合名称不能只用该前缀。

capped collections

在 mongodb 中,有一种特殊的集合,即 capped collections(固定集合)。固定集合可以声明集合的大小,其类似于循环队列数据占满时会覆盖前面的数据。capped collections 有以下特性:

  • 由于 capped collections 按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率,写效率非常高
  • 自动覆盖掉最老的文档,因此不需要再配置额外的工作来进行旧文档删除。
  • 不可以删除文档,但是可以更新文档(并且更新文档的大小不能超过原来大小,确保位置不会变化)。

capped collections 非常适合记录日志等场景。

capped collections 必须在使用前显式创建。

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

元数据

数据库的元数据存储在了集合命名空间 dbname.system.* 中,是包含多种系统信息的特殊集合。

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

数据类型

在 mongodb 的文档中,键为字符串,值可以是多种数据类型。 mongodb 提供多种数据类型,如下:

数据类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 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字节。含义为:

  • 前四个字节标识时间戳,为格林尼治时间。
  • 接下来的 3 个字节是机器标识码。
  • 紧接的两个字节由进程 id 组成 PID。
  • 最后三个字节是随机数。

img

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

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

时间戳和日期

在 MongoDB 中,时间戳用于 MongoDB 内部使用,与普通的日期类型不相关。时间戳值是一个 64 位的值,其中前 32 位为时间戳,后 32 位为在某秒操作中的一个递增序数。在单个 MongoDB 实例中,时间戳是唯一的。在复制集中, oplog 有一个 ts 字段为时间戳类型,表示了操作时间。

日期在 MongoDB 中存储为一般的时间戳,日期用于表示时间,供应用层使用。