简介
什么是MongoDB?
MongoDB 是由C 语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
主要特点
代码语言:javascript复制# MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
# 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sa
meer",Address="8 Gandhi Road")来实现更快的排序。
# 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
# 如果负载的增加(需要更多的存储空间和更强的处理能力)
,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
# Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
# MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
# Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
# Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
# Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
# GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
# MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
# MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C ,PHP,C#等多种语言。
# MongoDB安装简单。
MongoDB工具
监控
MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。 Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。 基于图形界面的开源工具 Cacti, 用于查看CPU负载, 网络带宽利用率,它也提供了一个应用于监控 MongoDB 的插件。
GUI
# Fang of Mongo – 网页式,由Django和jQuery所构成。
# Futon4Mongo – 一个CouchDB Futon web的mongodb山寨版
# Mongo3 – Ruby写成。
# MongoHub – 适用于OSX的应用程序。
# Opricot – 一个基于浏览器的MongoDB控制台, 由PHP撰写而成。
# Database Master — Windows的mongodb管理工具
# RockMongo — 最好的PHP语言的MongoDB管理工具,轻量级, 支持多国语言.
MongoDB应用案例
# Craiglist上使用MongoDB的存档数十亿条记录。
# FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
# Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
# bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
# spike.com,一个MTV网络的联营公司, spike.com使用MongoDB的。
# Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。
# sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
# etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
# 纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
# CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。
部署MongoDB
下载解压Mongo.tar包
代码语言:javascript复制# 下载地址
https://www.mongodb.com/download-center#community
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
tar xf mongodb-linux-x86_64-3.0.6.tgz -C /usr/local/
mv /usr/local/mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb
tail -1 /etc/bashrc
export PATH=/usr/local/mongodb/bin:$PATH
source /etc/bashrc
创建数据库目录
代码语言:javascript复制MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。 以下实例中我们将data目录创建于根目录下(/)。 注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。
mkdir -p /data/db
启动服务
代码语言:javascript复制你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。 注意:如果你的数据库目录不是/data/db,可以通过 --dbpath 来指定。
mongod
2020-06-19T09:56:51.152 0800 I STORAGE [initandlisten]
2020-06-19T09:56:51.152 0800 I STORAGE [initandlisten] ** WARNING: Readahead for /data/db is set to 4096KB
2020-06-19T09:56:51.152 0800 I STORAGE [initandlisten] ** We suggest setting it to 256KB (512 sectors) or less
2020-06-19T09:56:51.152 0800 I STORAGE [initandlisten] ** http://dochub.mongodb.org/core/readahead
MongoDB后台管理Shell
代码语言:javascript复制如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。 MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。 当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):
# 启动mongod服务后,再执行mongo就会进入下面命令行
mongo
MongoDB shell version: 3.0.6
connecting to: test
Welcome to the MongoDB shell.
# 新版本MongDB增加了安全性设计,推荐用户创建使用数据库时进行验证。如果用户想建立简单连接,则会提示警示信息
#创建管理员账号并设置密码:
>use admin
switched to db admin
> db.createUser( {user: "firstadmin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]});
Successfully added user: {
"user" : "firstadmin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
# 由于它是一个JavaScript shell,还可以运行一些简单的算术运算
> 1 1
2
> 10000 20000
30000
# 我们可以插入一些简单的数据,并对插入数据进行检索
> db.youmen.insert({x:10})
# 这个命令表示将数字10插入到youmen集合的x字段中
WriteResult({ "nInserted" : 1 })
> db.youmen.find()
{ "_id" : ObjectId("5eec1c706808f6fb8fbda718"), "x" : 10 }
MongoDB Web用户界面
代码语言:javascript复制MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest 。
mongod --dbpath=/data/db --rest
# MongoDB 的 Web 界面访问端口比服务的端口多1000。
# 如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:http://localhost:28017
MongoDB概念解析
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
通过下图实例,我们也可以直观的了解Mongo中的一些概念
数据库
代码语言:javascript复制一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为"db",该数据库存储在data目录中。 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。 "show dbs" 命令可以显示所有数据的列表。
> show dbs
local 0.078GB
test 0.078GB
# db显示当前数据库对象或集合
> db
test
# use命令,连接到一个指定的数据库
> use local
switched to db local
> db
local
代码语言:javascript复制数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
# 不能是空字符串("")。
# 不得含有' '(空格)、.、$、/、和 (空字符)。
# 应全部小写。
# 最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
文档(Document)
代码语言:javascript复制文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。 一个简单的文档例子如下:
{"site":"www.youmen.com", "name":"幽梦"}
下表列出了RDBMS与MongoDB对应的术语
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | 主键 (MongoDB 提供了 key 为 _id ) |
数据库服务和客户端 | |
Mysqld/Oracle | mongod |
mysql/sqlplus | mongo |
需要注意的是
# 1. 文档中的键/值对是有序的。
# 2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
# 3. MongoDB区分类型和大小写。
# 4. MongoDB的文档不能有重复的键。
# 5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
# 文档键命名规范:
# 键不能含有 (空字符)。这个字符用来表示键的结尾。
# .和$有特别的意义,只有在特定环境下才能使用。
# 以下划线"_"开头的键是保留的(不是严格要求的)。
集合
代码语言:javascript复制集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。 比如,我们可以将以下不同数据结构的文档插入到集合中:
{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.youmen.com","name":"幽梦","num":5}
当第一个文档被插入时,集合就会被创建
合法的集合名
# 集合名不能是空字符串""。
# 集合名不能含有 字符(空字符),这个字符表示集合名的结尾。
# 集合名不能以"system."开头,这是为系统集合保留的前缀。
# 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
Capped Collections
代码语言:javascript复制Capped collections 就是固定大小的collection。 它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。 Capped collections 是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能和标准的 collection 不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。collection 的数据存储空间值提前分配的。 Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。 由于 Capped collection 是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB 的操作日志文件 oplog.rs 就是利用 Capped Collection 来实现的。 要注意的是指定的存储大小包含了数据库的头信息。
db.createCollection("mycoll", {capped:true, size:100000})
在 capped collection 中,你能添加新的对象。 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。 使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。 删除之后,你必须显式的重新创建这个 collection。 在32bit机器中,capped collection 最大存储为 1e9( 1X109)个字节。
元数据
数据库的信息是存储在集合中。它们使用了系统的命名空间:
dbname.system.*
在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:
集合命名空间 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空间。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含数据库概要(profile)信息。 |
dbname.system.users | 列出所有可访问数据库的用户。 |
dbname.local.sources | 包含复制对端(slave)的服务器信息和状态。 |
对于修改系统集合中的对象有如下限制。 在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。 {{system.users}}是可修改的。 {{system.profile}}是可删除的。
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 | 正则表达式类型。用于存储正则表达式。 |
下面说明几种重要的数据类型
代码语言:javascript复制ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:
# 前 4 个字节表示创建 **unix** 时间戳,格林尼治时间 **UTC** 时间,比北京时间晚了 8 个小时
# 接下来的 3 个字节是机器标识码
# 紧接的两个字节由进程 id 组成 PID
# 最后三个字节是随机
代码语言:javascript复制MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象 由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2020-06-19T02:44:34Z")
Objectid转换为字符串
> newObject.str
5eec2692383608904cb30cb6
字符串
BSON 字符串都是 UTF-8 编码
时间戳
代码语言:javascript复制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("2020-06-19T02:49:22.128Z")
> var mydate2 = ISODate()
> mydate2
ISODate("2020-06-19T02:47:44.664Z")
# 这样创建的时间是日期类型,可以使用 JS 中的 Date 类型的方法。
# 返回一个时间类型的字符串:
> var mydate1str = mydate1.toString()
> mydate1str
Fri Jun 19 2020 10:49:22 GMT 0800 (CST)
> typeof mydate1str
string
OR
> Date()
Fri Jun 19 2020 10:53:15 GMT 0800 (CST)
MongoDB常用命令及配置文件参数详解
命令参数详解
代码语言:javascript复制--logpath # 日志文件路径
--master # 指定为主机器
--slave # 指定为从机器
--source # 指定主机器的IP地址
--pologSize # 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
--logappend # 日志文件末尾添加
--port # 启用端口号
--fork # 在后台运行
--only # 指定只复制哪一个数据库
--slavedelay # 指从复制检测的时间间隔
--auth # 是否需要验证权限登录(用户名和密码)
-h [ --help ] # show this usage information
--version # show version information
-f [ --config ] arg # configuration file specifying additional options
--port arg # specify port number
--bind_ip arg # local ip address to bind listener - all local ips
bound by default
-v [ --verbose ] # be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
--dbpath arg (=/data/db/) # directory for datafiles 指定数据存放目录
--quiet # quieter output 静默模式
--logpath arg # file to send all output to instead of stdout 指定日志存放目录
--logappend # appnd to logpath instead of over-writing 指定日志是以追加还是以覆盖的方式写入日志文件
--fork # fork server process 以创建子进程的方式运行
--cpu # periodically show cpu and iowait utilization 周期性的显示cpu和io的使用情况
--noauth # run without security 无认证模式运行
--auth # run with security 认证模式运行
--objcheck # inspect client data for validity on receipt 检查客户端输入数据的有效性检查
--quota # enable db quota management 开始数据库配额的管理
--quotaFiles arg # number of files allower per db, requires --quota 规定每个数据库允许的文件数
--appsrvpath arg # root directory for the babble app server
--nocursors # diagnostic/debugging option 调试诊断选项
--nohints # ignore query hints 忽略查询命中率
--nohttpinterface # disable http interface 关闭http接口,默认是28017
--noscripting # disable scripting engine 关闭脚本引擎
--noprealloc # disable data file preallocation 关闭数据库文件大小预分配
--smallfiles # use a smaller default file size 使用较小的默认文件大小
--nssize arg (=16) # .ns file size (in MB) for new databases 新数据库ns文件的默认大小
--diaglog arg # 0=off 1=W 2=R 3=both 7=W some reads 提供的方式,是只读,只写,还是读写都行,还是主要写 部分的读模式
--sysinfo # print some diagnostic system information 打印系统诊断信息
--upgrade # upgrade db if needed 如果需要就更新数据库
--repair # run repair on all dbs 修复所有的数据库
--notablescan # do not allow table scans 不运行表扫描
--syncdelay arg (=60) # seconds between disk syncs (0 for never) 系统同步刷新磁盘的时间,默认是60s
Replication options:
--master # master mode 主复制模式
--slave # slave mode 从复制模式
--source arg # when slave: specify master as <server:port> 当为从时,指定主的地址和端口
--only arg # when slave: specify a single database to replicate 当为从时,指定需要从主复制的单一库
--pairwith arg # address of server to pair with
--arbiter arg # address of arbiter server 仲裁服务器,在主主中和pair中用到
--autoresync # automatically resync if slave data is stale 自动同步从的数据
--oplogSize arg # size limit (in MB) for op log 指定操作日志的大小
--opIdMem arg # size limit (in bytes) for in memory storage of op ids指定存储操作日志的内存大小
Sharding options:
--configsvr # declare this is a config db of a cluster 指定shard中的配置服务器
--shardsvr # declare this is a shard db of a cluster 指定shard服务器
其他配置参数含义
--quiet # 安静输出
--port arg # 指定服务端口号,默认端口27017
--bind_ip arg # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
--logpath arg # 指定MongoDB日志文件,注意是指定文件不是目录
--logappend # 使用追加的方式写日志
--pidfilepath arg # PID File 的完整路径,如果没有设置,则没有PID文件
--keyFile arg # 集群的私钥的完整路径,只对于Replica Set 架构有效
--unixSocketPrefix arg # UNIX域套接字替代目录,(默认为 /tmp)
--fork # 以守护进程的方式运行MongoDB,创建服务器进程
--auth # 启用验证
--cpu # 定期显示CPU的CPU利用率和iowait
--dbpath arg # 指定数据库路径
--diaglog arg # diaglog选项 0=off 1=W 2=R 3=both 7=W some reads
--directoryperdb # 设置每个数据库将被保存在一个单独的目录
--journal # 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
--journalOptions arg # 启用日志诊断选项
--ipv6 # 启用IPv6选项
--jsonp # 允许JSONP形式通过HTTP访问(有安全影响)
--maxConns arg # 最大同时连接数 默认2000
--noauth # 不启用验证
--nohttpinterface # 关闭http接口,默认关闭27018端口访问
--noprealloc # 禁用数据文件预分配(往往影响性能)
--noscripting # 禁用脚本引擎
--notablescan # 不允许表扫描
--nounixsocket # 禁用Unix套接字监听
--nssize arg (=16) # 设置信数据库.ns文件大小(MB)
--objcheck # 在收到客户数据,检查的有效性,
--profile arg # 档案参数 0=off 1=slow, 2=all
--quota # 限制每个数据库的文件数,设置默认为8
--quotaFiles arg # number of files allower per db, requires --quota
--rest # 开启简单的rest API
--repair # 修复所有数据库run repair on all dbs
--repairpath arg # 修复库生成的文件的目录,默认为目录名称dbpath
--slowms arg (=100) # value of slow for profile and console log
--smallfiles # 使用较小的默认文件
--syncdelay arg (=60) # 数据写入磁盘的时间秒数(0=never,不推荐)
--sysinfo # 打印一些诊断系统信息
--upgrade # 如果需要升级数据库
#Replicaton 参数
--fastsync # 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
--autoresync # 如果从库与主库同步数据差得多,自动重新同步,
--oplogSize arg # 设置oplog的大小(MB)
#主/从参数
--master # 主库模式
--slave # 从库模式
--source arg # 从库 端口号
--only arg # 指定单一的数据库复制
--slavedelay arg # 设置从库同步主库的延迟时间
#Replica set(副本集)选项:
--replSet arg # 设置副本集名称
#Sharding(分片)选项
--configsvr # 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
--shardsvr # 声明这是一个集群的分片,默认端口27018
--noMoveParanoia # 关闭偏执为moveChunk数据保存
配置文件参数详解
代码语言:javascript复制# 简单示例
# 数据库数据存放目录
dbpath=/usr/local/mongodb/data
# 数据库日志存放目录
logpath=/usr/local/mongodb/logs/mongodb.log
# 以追加的方式记录日志
logappend = true
# 端口号 默认为27017
port=27017
# 以后台方式运行进程
fork=true
# 开启用户认证
auth=true
# 关闭http接口,默认关闭http端口访问
#nohttpinterface=true
# mongodb所绑定的ip地址
#bind_ip = 127.0.0.1
# 启用日志文件,默认启用
journal=true
# 这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true